Genere una cadena aleatoria única con letras y números en minúsculas

¿Cómo puedo corregir este código para que genere letras y números aleatorios únicos en minúsculas?

api_string = (0...32).map{65.+(rand(25)).chr}.join 

Por el momento, genera solo letras.

Si está usando ruby ​​1.9.2 puede usar SecureRandom:

 irb(main):001:0> require 'securerandom' => true irb(main):002:0> SecureRandom.hex(13) => "5bbf194bcf8740ae8c9ce49e97" irb(main):003:0> SecureRandom.hex(15) => "d2413503a9618bacfdb1745eafdb0f" irb(main):004:0> SecureRandom.hex(32) => "432e0a359bbf3669e6da610d57ea5d0cd9e2fceb93e7f7989305d89e31073690" 

Todas las letras y dígitos, así es como se representan los números en la base 36.

 api_string = Array.new(32){rand(36).to_s(36)}.join 

8.times.map { [*'0'..'9', *'a'..'z'].sample }.join

Aquí hay una forma de hacerlo:

 POSSIBLE = (('A'..'Z').to_a + (0..9).to_a) api_string = (0...32).map { |n| POSSIBLE.sample }.join 

Si tiene soporte activo disponible, también puede hacer esto para crear una cadena similar a una clave API:

 ActiveSupport::SecureRandom.hex(32) 

Olvidé de dónde, pero he leído esto de alguna manera esta mañana

 l,m = 24,36 rand(m**l).to_s(m).rjust(l,'0') 

crea un número aleatorio de 0 a potencia (36,24), luego lo convierte en base-36 (esto es 0-9 y az)

 CHARS = (?0..?9).to_a + (?a..?z).to_a api_string = 32.times.inject("") {|s, i| s << CHARS[rand(CHARS.size)]} 
 ((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join 

Reemplace rand(100) con rand(n) donde n es la longitud máxima de la cadena deseada.

Usando SecureRandom del lenguaje ruby.

 require 'securerandom' randomstring = SecureRandom.hex(5) 

Generará que la cadena aleatoria n * 2 contenga “0-9” y “af”

 Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)