Necesito generar un código alfanumérico de seis dígitos único. Para guardar en mi base de datos como no voucher: para cada transacción.Cómo generar un código alfanumérico único de seis dígitos en Ruby
Respuesta
I utilizó este
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,6]
How to generate a random string in Ruby este enlace fue útil
Esta es una respuesta muy mala con alta probabilidad de colisión. Con 1 millón de iteraciones hay 767 ** mil ** colisiones en 215 mil claves. Alterar el número aleatorio de '10000' a' 10000000' reduce las colisiones a "solo" 31,000 de 1,000,000, pero cualquier colisión sigue siendo mala. Esto es cierto tanto si Time.now es siempre el mismo como si devuelve un nuevo valor en cada llamada (por ejemplo, no más de una transacción por segundo). – Phrogz
En el caso normal este es aceptable. ¿Hay alguna otra manera para esto? – rubyprince
Una mejor manera es dejar que la base de datos maneje los identificadores (incrementando). Pero si insiste en generarlos usted mismo, puede usar un generador aleatorio para generar un código, compruébelo con db para ver su singularidad. entonces aceptar o regenerar
Esta es una mala idea en teoría cuando empiezas a llenar el espacio de nombres disponible, ya que aumentan tus posibilidades de colisiones y, en el extremo, puedes terminar atrapado en un ciclo de regeneración durante mucho tiempo antes de encontrar una clave libre. – Phrogz
que haría uso de la base de datos para generar claves únicas, pero si insiste en hacerlo de la manera difícil:
class AlnumKey
def initialize
@chars = ('0' .. '9').to_a + ('a' .. 'z').to_a
end
def to_int(key)
i = 0
key.each_char do |ch|
i = i * @chars.length + @chars.index(ch)
end
i
end
def to_key(i)
s = ""
while i > 0
s += @chars[i % @chars.length]
i /= @chars.length
end
s.reverse
end
def next_key(last_key)
to_key(to_int(last_key) + 1)
end
end
al = AlnumKey.new
puts al.next_key("ab")
puts al.next_key("1")
puts al.next_key("zz")
Por supuesto, usted tiene que almacenar su clave actual en algún lugar, y esto es en ningún hilo forma/multisesión-safe etc.
con las siguientes restricciones:
- válido sólo hasta el 24/12/2038 00:40:35 GMT
- no genera más de una vez dentro de un segundo
puede utilizar este sencillo código:
Time.now.to_i.to_s(36)
# => "lks3bn"
¿Qué pasará si se cambia la hora del sistema? – Zabba
a la vez Necesito obtener diferentes identificadores de cupones –
@Zabba Eso causará un problema, pero asumí que no será tan frecuente. En ese caso, el sistema tendrá que estar inactivo para el mantenimiento durante el lapso de tiempo que iguala la diferencia entre las zonas horarias nueva y antigua. Será menos de un día, en el peor. Si la nueva zona horaria continúa, el sistema no tiene que estar inactivo. – sawa
class IDSequence
attr_reader :current
def initialize(start=0,digits=6,base=36)
@id, @chars, @base = start, digits, base
end
def next
s = (@id+=1).to_s(@base)
@current = "0"*(@chars-s.length) << s
end
end
id = IDSequence.new
1234.times{ id.next }
puts id.current
#=> 0000ya
puts id.next
#=> 0000yb
9876543.times{ id.next }
puts id.current
#=> 05vpqq
Esto eleviat e el problema de la colisión de tiempo al obtener los mili segundos
(Time.now.to_f*1000.0).to_i
- 1. ¿Cómo generar un alfanumérico único?
- 2. Convertir una tupla de color RGB a un código de seis dígitos, en Python
- 3. Generar ID único
- 4. Creación de una cadena de 10 caracteres alfanumérico único
- 5. ¿Cómo puedo crear un código único de 7 dígitos para una entidad?
- 6. Generar un número aleatorio de N-dígitos
- 7. Cómo generar un número aleatorio de cinco dígitos de Java
- 8. generar un número aleatorio con 7 dígitos
- 9. NHibernate SchemaExport: ¿Cómo generar un nombre de clave único significativo?
- 10. ID único del sistema en Ruby ...?
- 11. Expresión regular para alfanumérico
- 12. Generar una matriz de todas las letras y dígitos
- 13. Alfanumérico a numérico solamente
- 14. Generar identificador de uinque de 8 dígitos en C#
- 15. ¿Cómo puedo generar un calendario de torneos en Ruby?
- 16. ¿Cómo generar un hash único para una URL?
- 17. Cómo generar ID de objeto único en mongodb
- 18. Código para generar números aleatorios gaussianos (normalmente distribuidos) en Ruby
- 19. Dígitos inversos en R
- 20. ¿Cómo generar una fecha aleatoria en Ruby?
- 21. algoritmo para generar un código único (constante) de una cadena que debe ser reversible
- 22. cómo dejar de generar código en un botón en particular?
- 23. bloques de código, proyecto único, muchos ejecutables
- 24. ¿Cómo generar el inicializador en Ruby?
- 25. Ordenar un valor alfanumérico mysql
- 26. Generar documentación de código HTML de un solo archivo
- 27. ¿Cómo puedo generar un entero aleatorio de n dígitos en Java utilizando la clase BigInteger?
- 28. Ruby, generar un color hexadecimal aleatorio
- 29. Creación de un único proxy de página con Ruby Sinatra
- 30. ¿Cómo generar selector css único para el elemento DOM?
¿Por qué no solo está autoincrementando el código? Serían numéricos entonces. Si tiene demasiados códigos (más de 6 dígitos), puede usar una base32 de este número, p. – Jens
¿Posible duplicado? http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby – Teoulas
@Teoulas No lo creo. No hay nada en esta pregunta que indique que los códigos deben ser (o aparecer) aleatorios. – Phrogz