Pregunta

Estoy buscando crear un sistema de reserva simple de corta duración, y me gustaría generar números de confirmación que sean

  • único
  • de aspecto aleatorio
  • alfanumérico
  • short-ish, al menos mucho más corto que 32 cadenas de caracteres de largo devueltas por sha1

Solo estoy buscando tener ~ 500 reservas, así que no imagino una 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, luego truncarlo a sus primeros 10 caracteres. ¿Algo así sería lo suficientemente confiable para procesar ~ 500 reservas?

¿Fue útil?

Solución

No debería 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 mayormente 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 se mantiene después de eso, use la sugerencia de Anders. Si tienes un conflicto, solo genera otro.

Otros consejos

Puede usar lo que sea, incluso un generador de números aleatorios simple; 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 aleatorio / sha1 / etc.

  

Solo estoy buscando tener ~ 500 reservas, así que no imagino una alta probabilidad de colisiones.

Otra idea estúpida: generar 1000 o 2000 números aleatorios únicos con las propiedades deseadas, almacenarlos en algún lugar y asignarlos a los usuarios cuando se registren :)

Aquí hay una forma 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 dura la parte (), por lo que es posible que tengas que ajustar los números para que se ajusten a tu longitud. También puede eliminar esa parte si no la necesita.

Si en realidad son solo 500, pregenere 20,000 de ellos, en una tabla, luego obtenga el '' siguiente no utilizado '' Cuándo lo necesitas.

Algunos buenos consejos sobre esta pregunta: ¿Cómo creo una cadena alfanumérica aleatoria en C ++?

Evitaría incluir caracteres como '' 1 '', '' l '', y '' O '', '' 0 '' y '' 5 '', '' S '' y '' Z '', '' 2 '' en su cadena, para facilitar a los clientes cuando necesitan leer su código de reserva por teléfono. El algoritmo presentado en ese enlace debería ayudarlo a hacer esto.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top