2012-09-25 22 views
5

Intentando generar dígitos aleatorios con la clase de raíles SecureRandom. ¿Podemos crear un número aleatorio con SecureRandom.hex que incluye solo dígitos y sin alfabetos?Segura Dígitos hexadecimales aleatorios solo

Por ejemplo:

En lugar de

SecureRandom.hex(4) 
=> "95bf7267" 

Se debe dar

SecureRandom.hex(4) 
=> "95237267" 

Respuesta

8

Mira la API para SecureRandom: http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

Creo que usted está buscando una método diferente: #random_number.

SecureRandom.random_number(a_big_number) 

Desde #hex devuelve un número hexadecimal, sería inusual para pedir un resultado aleatorio que contenía sólo caracteres numéricos.

Para casos de uso básico, es bastante simple de usar #rand.

rand(9999) 

Editado:

No estoy al tanto de una biblioteca que genera un número aleatorio de longitud especificada, pero parece lo suficientemente simple para escribir uno. Aquí está mi pase en él:

def rand_by_length(length) 
    rand((9.to_s * length).to_i).to_s.center(length, rand(9).to_s).to_i 
end 

El #rand_by_length método toma una longitud Especificación de número entero como un parámetro y trata de generar un número aleatorio de dígitos max en base a la longitud. String # center se usa para rellenar los números faltantes con números aleatorios. El peor caso llama #rand para cada dígito de longitud especificada. Eso puede servir a tu necesidad.

+0

Gracias por la corrección en el "número hexadecimal" Me gustaría explicarlo aún más, en realidad estaba buscando un número al azar con una longitud específica (deja ay 8), el hexadecimal restringe la longitud, por lo que se pregunta algo similar, es posible que SecureRandom genere solo números. SecureRandom.random_number (n) probablemente no permitirá esto? [random_number] (http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

Actualicé mi respuesta en función de su comentario. – rossta

+0

Eso es genial ... Muchas gracias por ese código ... – swapab

1

Las identificaciones numéricas son buenas porque son más fáciles de leer por teléfono (no c para charlie).

Prueba este

length = 20 
id = (SecureRandom.random_number * (10**length)).round.to_s # => "98075825200269950976" 

y de puntos de bonificación lo rompen para facilitar la lectura

id.split(//).each_slice(4).to_a.map(&:join).join('-') # => "9807-5825-2002-6995-0976" 
1
length = 4 

[*'0'..'9'].sample(length).join 

tan simple como eso :)

+0

se olvidó de eso, gracias @zondo – avital

+0

Mi 1 centavo: Sin el símbolo '(0..9) .to_a.ample (longitud) .join' – swapab

+0

@ swap.nil ¿por qué es mejor? – avital

Cuestiones relacionadas