Je suis tombé sur un problème intéressant aujourd'hui, et j'ai parcouru internet à la recherche d'une solution mais je n'en ai trouvé aucune. Le problème est le suivant:Fonction de hachage 1-à-1 aléatoire
Un utilisateur crée un compte et reçoit un numéro d'identification unique, disons 123, pour représenter son compte. Quand un autre utilisateur crée un compte, je peux simplement ajouter 1 au numéro d'identification le plus récemment créé et lui assigner, 124. Cependant, cela ne rend pas complètement anonyme tout le monde comme il sait maintenant que l'utilisateur 123 s'est enregistré avant lui. Un très petit problème à avoir, mais dans certaines situations concevables cela pourrait causer des problèmes beaucoup plus importants.
Une meilleure solution serait d'avoir des ID aléatoires mais uniques afin que personne ne puisse dire qui est venu en premier.
Pour résoudre ce problème, vous pouvez utiliser une fonction de hachage standard ou un générateur de nombres aléatoires pour créer un ID unique pour chaque personne, mais vous risquez alors de rencontrer des collisions. Cela peut être évité en vérifiant les collisions et en recommençant à fonctionner, mais disons pour cet exemple que cela va trop ralentir le système. Ou il se peut que le générateur fonctionne sur des informations incomplètes et ne puisse pas vérifier s'il y a des collisions.
Une idée différente que je suis venu avec est d'avoir essentiellement un jeu de cartes mélangé que vous stockez et en prendre un au large à chaque fois que vous avez besoin d'un nouvel ID. Quand vous n'avez plus de cartes dans le paquet, vous prenez un nouveau deck en continuant à la plus haute carte de votre dernier deck et vous mélangez celui-ci. Inconvénients à cela sont que vous devez stocker ce jeu de cartes et si vous perdez accidentellement le jeu, vous rencontrez de nombreux problèmes en essayant de le recréer ou de continuer sans.
Une solution très similaire à celle-ci consiste à recréer à chaque fois cette planche mélangée à partir d'une graine fixe, et à prendre la nième carte du pont au lieu de la première. Le problème que cela a, c'est qu'il peut être coûteux de mélanger ce jeu chaque fois que vous avez besoin d'une nouvelle carte.
D'autres modèles mathématiques que j'ai essayé de trouver tous ont le problème du nombre prévisible de la séquence (chaque nombre est une quantité fixe en dehors de la précédente). Beaucoup d'entre eux ont aussi des problèmes de collisions. Donc ma question est: Y at-il un modèle mathématique que je peux brancher des numéros pour obtenir des identifiants uniques qui ne nécessitent pas l'utilisation d'un "deck" (read: array) stocké en mémoire ou recalculé à chaque appel de fonction.
Par exemple
randomID(number, seed, range)
randomID(1,123,1000) = 284
randomID(2,123,1000) = 739
randomId(3,123,1000) = 088
randomId(3,888,1000) = 912
J'ai regardé https://code.google.com/p/smhasher/wiki/MurmurHash3 qui semble être prometteuse, mais je ne pense pas qu'il applique sur une plage arbitraire de nombres, et seulement sur 32bits ou 64bits.
Félicitations! vous venez d'arriver avec GUID: http://stackoverflow.com/questions/371762/what-exactly-is-guid-why-and-where-i-should-use-it – trailmax
Vous ne savez pas pourquoi la réponse de trailmax est un commentaire mais c'est une bonne réponse La plupart des langues ont une bibliothèque pour générer un GUID. La valeur n'est pas garantie d'être unique, mais les chances de collision sont astronomiquement faibles, que, pour toutes fins pratiques, ils fonctionnent comme des identifiants uniques, non séquentiels. –