Voici ce que j'utilise. Le jeton n'a pas nécessairement besoin d'être entendu pour deviner, il s'agit plus d'un identifiant d'url court qu'autre chose, et je veux être bref. J'ai suivi quelques exemples que j'ai trouvés en ligne et en cas de collision, je pense que le code ci-dessous recréera le jeton, mais je ne suis pas vraiment sûr. Je suis curieux de voir de meilleures suggestions, cependant, car cela semble un peu difficile sur les bords.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Ma colonne de base de données pour le jeton est un index unique et j'utilise également validates_uniqueness_of :token
sur le modèle, mais comme ils sont créés automatiquement par lots en fonction des actions d'un utilisateur dans l'application (ils passent une commande et achètent les jetons, essentiellement), c'est impossible de faire en sorte que l'application génère une erreur.
Je pourrais aussi, je suppose, pour réduire les risques de collision, ajouter une autre chaîne à la fin, quelque chose de généré en fonction de l'heure ou quelque chose du genre, mais je ne veux pas que le jeton devienne trop long.