Voici ce que j'utilise. Le jeton n'a pas nécessairement à être entendu à deviner, c'est plus comme une url courte identifiant qu'autre chose, et je veux le garder court. J'ai suivi quelques exemples que j'ai trouvés en ligne et dans le cas d'une collision, je pense que le code ci-dessous va recréer le jeton, mais je ne suis pas vraiment sûr. Je suis curieux de voir de meilleures suggestions, même si, comme cela se sent un peu rude 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 je suis également en utilisant validates_uniqueness_of :token
sur le modèle, mais parce que ceux-ci sont créés dans des lots automatiquement, basée sur les actions d'un utilisateur dans l'application (ils passer une commande et d'acheter les jetons, essentiellement), il n'est pas possible d'avoir l'application renvoie une erreur.
Je pourrais aussi, je suppose, pour réduire le risque de collisions, ajouter une autre chaîne à la fin, quelque chose généré en fonction du temps ou quelque chose comme ça, mais je ne veux pas le jeton trop long.