Question

Je souhaite créer un système de réservation simple et de courte durée, et générer des numéros de confirmation

.
  • unique
  • aléatoire
  • alphanumérique
  • short-ish, au moins beaucoup plus court que les chaînes de 32 caractères renvoyées par sha1

Je ne cherche qu'à avoir environ 500 réservations. Par conséquent, je n'imagine pas une probabilité élevée de collisions.

L’une de mes idées est de générer un hachage sha1 basé sur un horodatage et un nom d’utilisateur, puis de le tronquer à ses 10 premiers caractères. Est-ce que quelque chose comme ça serait suffisamment unique pour pouvoir traiter environ 500 réservations?

Était-ce utile?

La solution

Il ne devrait y avoir aucune différence dans le caractère aléatoire d'un bit donné d'un hachage SHA-1, donc c'est possible. Une autre solution consisterait à incorporer le hachage en utilisant XOR jusqu'à obtenir 60 bits de données, puis à l'encoder à l'aide de Base 64 pour obtenir un résultat essentiellement alphanumérique.

Cela n’est nécessaire que si vous souhaitez pouvoir générer le même ID à plusieurs reprises pour les mêmes données d’entrée. Sinon, si un identifiant aléatoire que vous générez une fois et que vous conservez ensuite, utilisez la suggestion d'Anders. Si vous obtenez un conflit, générez-en un autre.

Autres conseils

Vous pouvez utiliser n'importe quel outil, même un simple générateur de nombres aléatoires. Cependant, vous devez vérifier que le code de réservation n'est pas déjà présent. Si tel est le cas, ajoutez des caractères ('x') à la chaîne (date + utilisateur) jusqu'à ce que vous obteniez un nouveau message aléatoire / sha1 / etc.

  

Je cherche seulement à avoir environ 500 réservations, donc je n'imagine pas une probabilité élevée de collisions.

Une autre idée stupide: générer 1000 ou 2000 nombres aléatoires uniques avec les propriétés souhaitées, les stocker quelque part et les attribuer aux utilisateurs lors de leur enregistrement:)

Voici un moyen de le faire 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(); }

Je ne me souviens pas de la longueur de la partie time (), vous devrez donc peut-être ajuster les nombres en fonction de votre longueur. Vous pouvez également supprimer cette partie si vous n'en avez pas besoin.

S'il ne s'agit en réalité que de 500, pré-générez 20 000 d'entre eux dans un tableau, puis récupérez le "prochain inutilisé". quand vous en avez besoin

Quelques bons conseils sur cette question: Comment créer une chaîne alphanumérique aléatoire en C ++?

J'éviterais d'inclure des caractères tels que "1", "l", et "O", "0" et "5", "S" et "Z", "2". dans votre chaîne, afin de faciliter la tâche des clients qui ont besoin de lire votre code de réservation par téléphone. L'algorithme présenté sur ce lien devrait vous aider à le faire.

utiliser un guid? 16 caractères, mais si vous ne vous souciez pas vraiment de la collision, vous pouvez simplement choisir les n premiers caractères.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top