2009-01-21 13 views
7

Estoy mirando para crear un sencillo sistema de reservas de corta duración, y me gustaría para generar números de confirmación que sonCreación de una cadena de 10 caracteres alfanumérico único

  • única
  • aleatoria de aspecto
  • alfanuméricos
  • corto ish, cuerdas, al menos, mucho más corto que 32 caracteres de largo devueltos por sha1

Sólo estoy mirando tener ~ 500 reservas, por lo que no imagine alta probabilidad de colisiones.

Una idea que tuve fue generar un hash Sha1 basado en un sello de fecha y hora y un nombre de usuario, y luego truncarlo a sus primeros 10 caracteres. ¿Sería algo así como suficientemente único para procesar ~ 500 reservas?

Respuesta

4

No debe haber diferencia en la aleatoriedad de un bit determinado de un hash SHA-1, por lo que es posible. Otra forma sería doblar el hash en sí mismo usando XOR hasta que tenga 60 bits de datos, luego codificarlo usando Base 64 para obtener un resultado principalmente alfanumérico.

Esto solo es necesario si desea poder generar el mismo Id repetidamente para los mismos datos de entrada. De lo contrario, si una identificación aleatoria que genera una vez, y aferrarse después de eso, use la sugerencia de Anders. Si tienes un conflicto, solo genera otro.

+2

podría sugerir base 32 en su lugar? si algún ser humano va a tener que transcribir esta secuencia, Crockford's Base32 es una opción muy superior http://crockford.com/wrmg/base32.html – Breton

2

Aquí hay una manera de hacerlo en Perl:

sub get_random_name() 
{ 
    my @chars=('a'..'z','A'..'Z'); 
    my $random_string;

foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }

No recuerdo cuánto tiempo la pieza del tiempo() es, por lo que es posible que tenga que ajustar los números para adaptarse a su longitud. También puedes quitar esa parte si no la necesitas.

3

Puede usar cualquier cosa, incluso un generador de números aleatorios simples; sin embargo, debe verificar que el código de reserva no esté presente. Si este es el caso, agregue caracteres ('x') a la cadena (fecha + usuario) hasta que obtenga un nuevo random/sha1/etc.

Solo busco tener ~ 500 reservas, por lo que no me imagino alta probabilidad de colisiones.

Otra idea estúpida: generar 1000 o 2000 números aleatorios únicos con las propiedades deseadas, almacenarlos en alguna parte, y asignarlos a los usuarios que se registran :)

0

usar un GUID? 16 caracteres, aunque si realmente no te importa la colisión, puedes elegir los primeros n caracteres.

+0

Tenga en cuenta que las subcadenas de GUID no están garantizadas en absoluto http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx – Eclipse

+0

El algoritmo guid garantiza únicamente la exclusividad, no se puede suponer que las guiones generadas sean aleatorias, lo que sería un requisito para el uso como ID de sesión. –

+0

ver también http://stackoverflow.com/questions/467271/how-random-is-system-guid-newguid#467296 –

1

Algunos buenos consejos sobre esta pregunta: How do I create a random alpha-numeric string in C++?

yo evitaría incluyendo personajes como "1", "L" y "O", "0" y "5", "S", y " Z "," 2 "en su cadena, para que sea más fácil para los clientes cuando necesiten leer su código de reserva por teléfono. El algoritmo presentado en ese enlace debería ayudarte a hacer esto.

2

Si es realmente solo 500, pregenere 20,000 de ellos, en una tabla, luego obtenga el "próximo sin usar" cuando lo necesite.

+1

¿por qué no generar 500? – NimChimpsky

+0

Si tuviera que encurtir un generador para usarlo en una futura ejecución, ¿tendría que sobrescribir el generador decapado después de las ejecuciones subsiguientes para conservar los valores? –

Cuestiones relacionadas