Desde Ruby 2.5, es realmente fácil con SecureRandom.alphanumeric
:
len = 8
SecureRandom.alphanumeric(len)
=> "larHSsgL"
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:
require 'benchmark'
require 'securerandom'
len = 10
n = 100_000
Benchmark.bm(12) do |x|
x.report('SecureRandom') { n.times { SecureRandom.alphanumeric(len) } }
x.report('rand') do
o = [('a'..'z'), ('A'..'Z'), (0..9)].map(&:to_a).flatten
n.times { (0...len).map { o[rand(o.length)] }.join }
end
end
user system total real
SecureRandom 0.429442 0.002746 0.432188 ( 0.432705)
rand 0.306650 0.000716 0.307366 ( 0.307745)
Entonces, la rand
solución solo toma alrededor de 3/4 del tiempo de SecureRandom
. 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.
reset_user_password!(random_string)
dondedef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64