Actualmente estoy generando una cadena mayúscula pseudoaleatoria de 8 caracteres para "A" .. "Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
pero no se ve limpio, y no se puede pasar como argumento ya que no es una sola declaración. Para obtener una cadena de mayúsculas y minúsculas "a" .. "z" más "A" .. "Z", la cambié a:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
Pero parece basura.
¿Alguien tiene un mejor método?
reset_user_password!(random_string)
dondedef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64
Respuestas:
Paso demasiado tiempo jugando al golf.
Y una última que es aún más confusa, pero más flexible y desperdicia menos ciclos:
fuente
('a'..'z').to_a.shuffle[0,8].join
. Tenga en cuenta que necesitará Ruby> = 1.9 parashuffle
.SecureRandom
como un ejemplo, en las otras respuestas.[*('a'..'z'),*('0'..'9')].shuffle[0,8].join
para generar una cadena aleatoria con letras y números.rand
Es determinista y predecible. ¡No use esto para generar contraseñas! Use una de lasSecureRandom
soluciones en su lugar.¿Por qué no usar SecureRandom?
SecureRandom también tiene métodos para:
ver: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
fuente
require 'securerandom'
para obtener esta ordenadaSecureRandom
de ayuda :)SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")
generará una cadena con 0-9a-z (36 caracteres) que SIEMPRE tiene 12 caracteres de longitud. Cambie 12 a la longitud que desee. Desafortunadamente, no hay forma de obtener AZ usandoInteger#to_s
.+fGH1
través de una URL, solo necesita codificarla como si fuera CUALQUIER valor que esté pasando por una URL:%2BfGH1
Lo uso para generar cadenas aleatorias de URL amigables con una longitud máxima garantizada:
Genera cadenas aleatorias de minúsculas az y 0-9. No es muy personalizable, pero es corto y limpio.
fuente
rand.to_s
; feo, pero funciona.length
, aproximadamente una vez en ~ 40(36**(length-1) + rand(36**length)).to_s(36)
. 36 ** (longitud-1) convertido a base 36 es 10 ** (longitud-1), que es el valor más pequeño que tiene la longitud de dígitos que desea.(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
NameError: undefined local variable or method
longitud 'para main: Object`Esta solución genera una cadena de caracteres fácilmente legibles para los códigos de activación; No quería que las personas confundieran 8 con B, 1 con I, 0 con O, L con 1, etc.
fuente
SecureRandom.random_number(charset.size)
lugar derand(charset.size)
%w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}
y%w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }
(la primera lista no incluye minúsculas, pero es más larga) Un poco interesante cómo eso funcionó.Otros han mencionado algo similar, pero esto utiliza la función segura de URL.
El resultado puede contener AZ, az, 0-9, "-" y "_". "=" También se usa si el relleno es verdadero.
fuente
Desde Ruby 2.5, es realmente fácil con
SecureRandom.alphanumeric
:Genera cadenas aleatorias que contienen AZ, az y 0-9 y, por lo tanto, deberían ser aplicables en la mayoría de los casos de uso. Y se generan aleatoriamente seguros, lo que también podría ser un beneficio.
Este es un punto de referencia para compararlo con la solución que tiene más votos a favor:
Entonces, la
rand
solución solo toma alrededor de 3/4 del tiempo deSecureRandom
. Eso podría importar si genera muchas cadenas, pero si solo crea alguna cadena aleatoria de vez en cuando, siempre iría con la implementación más segura, ya que también es más fácil de llamar y más explícita.fuente
Genere una cadena aleatoria de 8 letras (por ejemplo, NVAYXHGR)
Genere una cadena aleatoria de 8 caracteres (por ejemplo, 3PH4SWF2), excluye 0/1 / I / O. Ruby 1.9
fuente
[*("A".."Z")]'
; ((no solo qoutes))stub
esto pararspec
pasar.No recuerdo dónde encontré esto, pero me parece el mejor y el menos intenso proceso:
fuente
0
y1
yO
yI
faltaron intencionalmente porque esos personajes son ambiguos. Si se usa este tipo de código para generar un conjunto de caracteres que un usuario necesita copiar, es mejor excluir los caracteres que pueden ser difíciles de distinguir fuera de contexto.fuente
Random.new.bytes(9)
n=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
Si desea una cadena de longitud especificada, use:
Generará una cadena aleatoria de longitud que
2n
contiene0-9
ya-f
fuente
n
, en realidad genera una cadena de 4/3 den
..hex
que sea 2n. Documentación: SecureRandom.hex genera una cadena hexadecimal aleatoria. El argumento n especifica la longitud, en bytes, del número aleatorio que se generará. La longitud de la cadena hexadecimal resultante es el doble de n .Array.new(n){[*"0".."9"].sample}.join
, dónden=8
en tu caso.Generalizado:
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
etc.De: " Generar cadena pseudoaleatoria AZ, 0-9 ".
fuente
fuente
Aquí hay un código simple de una línea para una cadena aleatoria con longitud 8:
También puede usarlo para una contraseña aleatoria que tenga una longitud 8:
fuente
P(36, 8) / 36^8 = 0.4
el espacio de caracteres posible para 8 caracteres (~ 2x más fácil para la fuerza bruta) oP(36, 25) / 36^25 = 0.00001
del espacio de caracteres posible para 25 caracteres (~ 100,000x más fácil para la fuerza bruta).Ruby 1.9+:
fuente
map
solución es realmente buena!#sample
cuántos elementos desea. Por ejemploALPHABET.sample(10).join
... ruby-doc.org/core-2.4.0/Array.html#method-i-samplesample(10)
te da 10 muestras únicas. Pero quieres permitir que se repitan. Pero lo usaríaArray.new(10).map
para el rendimientoArray.new
y su sintaxis de bloque.Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
Tenga en cuenta:
rand
es predecible para un atacante y, por lo tanto, probablemente inseguro. Definitivamente debe usar SecureRandom si esto es para generar contraseñas. Yo uso algo como esto:fuente
Aquí hay un código simple para contraseña aleatoria con longitud 8:
fuente
Otro método que me gusta usar:
Agregue
ljust
si está realmente paranoico sobre la longitud correcta de la cadena:fuente
Algo de idear
fuente
.tr('+/=lIO0', 'pqrsxyz')
?Creo que este es un buen equilibrio de concisión, claridad y facilidad de modificación.
Modificado fácilmente
Por ejemplo, incluidos los dígitos:
Hexadecimal mayúscula:
Para una variedad realmente impresionante de personajes:
fuente
Solo agrego mis centavos aquí ...
fuente
rand
Puedes usar
String#random
desde Facets of Ruby Gemfacets
.Básicamente hace esto:
fuente
Mi favorito es
(:A..:Z).to_a.shuffle[0,8].join
. Tenga en cuenta que barajar requiere Ruby> 1.9.fuente
Esta solución necesita dependencia externa, pero parece más bonita que otra.
Faker::Lorem.characters(10) # => "ang9cbhoa8"
fuente
Dado:
La expresión única, se puede pasar como argumento, permite caracteres duplicados:
fuente
Me gusta más la respuesta de Radar, hasta ahora, creo. Ajustaría un poco así:
fuente
(CHARS*length).sample(length).join
?CHARS=['a','b']
su método generaría"aa"
o"bb"
solo el 33% del tiempo,"ab"
o el"ba"
67% del tiempo. Tal vez eso no sea un problema, ¡pero vale la pena tenerlo en cuenta!fuente
Mis 2 centavos:
fuente
Acabo de escribir una pequeña gema
random_token
para generar tokens aleatorios para la mayoría de los casos de uso, disfruta ~https://github.com/sibevin/random_token
fuente
2 soluciones para una cadena aleatoria que consta de 3 rangos:
Un personaje de cada rango.
Y si necesita al menos un carácter de cada rango, como crear una contraseña aleatoria que tenga una letra mayúscula, una letra minúscula y un dígito, puede hacer algo como esto:
fuente
( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
Estaba haciendo algo como esto recientemente para generar una cadena aleatoria de 8 bytes a partir de 62 caracteres. Los caracteres fueron 0-9, az, AZ. Tuve una matriz de ellos, ya que estaba haciendo un bucle 8 veces y seleccionando un valor aleatorio de la matriz. Esto estaba dentro de una aplicación Rails.
Lo extraño es que obtuve una buena cantidad de duplicados. Ahora al azar esto casi nunca debería suceder. 62 ^ 8 es enorme, pero de 1200 más o menos códigos en la base de datos tuve una buena cantidad de duplicados. Me di cuenta de que ocurrían en límites de horas entre sí. En otras palabras, podría ver un duplicado a las 12:12:23 y 2:12:22 o algo así ... no estoy seguro si el tiempo es el problema o no.
Este código estaba en la creación anterior de un objeto ActiveRecord. Antes de que se creara el registro, este código se ejecutaría y generaría el código 'único'. Las entradas en el DB siempre se produjeron de manera confiable, pero el código (
str
en la línea anterior) se duplicaba con demasiada frecuencia.Creé un script para ejecutar 100000 iteraciones de esta línea anterior con un pequeño retraso, por lo que tomaría de 3 a 4 horas con la esperanza de ver algún tipo de patrón de repetición por hora, pero no vi nada. No tengo idea de por qué sucedía esto en mi aplicación Rails.
fuente