Je faisais quelque chose comme ça récemment pour générer une chaîne aléatoire de 8 octets à partir de 62 caractères. Les caractères étaient 0-9, az, AZ. J'en avais un tableau comme en boucle 8 fois et en choisissant une valeur aléatoire dans le tableau. C'était dans une application Rails.
str = ''
8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }
La chose étrange est que j'ai eu un bon nombre de doublons. Maintenant, au hasard, cela ne devrait pratiquement jamais se produire. 62 ^ 8 est énorme, mais sur 1200 codes environ dans la base de données, j'ai eu un bon nombre de doublons. Je les ai vus se produire aux limites des heures les uns des autres. En d'autres termes, je pourrais voir un double à 12:12:23 et 2:12:22 ou quelque chose comme ça ... je ne sais pas si le temps est le problème ou non.
Ce code était dans la création antérieure d'un objet ActiveRecord. Avant la création de l'enregistrement, ce code s'exécutait et générait le code «unique». Les entrées dans la base de données étaient toujours produites de manière fiable, mais le code ( str
dans la ligne ci-dessus) était dupliqué beaucoup trop souvent.
J'ai créé un script pour exécuter 100 000 itérations de cette ligne ci-dessus avec un petit retard, il faudrait donc 3-4 heures en espérant voir une sorte de motif de répétition toutes les heures, mais je n'ai rien vu. Je ne sais pas pourquoi cela se produisait dans mon application Rails.
reset_user_password!(random_string)
oùdef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64