web-dev-qa-db-fra.com

Est-il sûr de supposer qu'un GUID sera toujours unique?

Je sais qu'il y a une possibilité infime de conflit, mais si j'ai généré un lot de 1000 GUID (par exemple), serait-il sûr de supposer qu'ils sont tous uniques pour enregistrer les tests de chacun?

Question bonus

Une façon optimale de tester un GUID pour l'unicité? Filtre Bloom peut-être?

107
Tom Savage

Oui, vous pouvez. Étant donné que les GUID ont une longueur de 128 bits, il y a certes une possibilité infime de conflit, mais le mot "minute" est loin d'être assez fort. Il y a tellement de GUID que si vous en générez plusieurs trillions au hasard, vous êtes encore plus susceptible d'être touché par un météorite que d'avoir même une collision (de Wikipedia ). Et si vous ne les générez pas au hasard, mais que vous utilisez par exemple en utilisant l'algorithme MAC-address-and-time-stamp, ils seront également uniques, comme MAC les adresses sont uniques parmi les ordinateurs et les horodatages sont uniques sur votre ordinateur.

Édition 1: Pour répondre à votre question bonus, la manière optimale de tester un ensemble de GUID pour l'unicité est de simplement supposer qu'ils sont tous uniques. Pourquoi? Étant donné le nombre de GUID que vous générez, les chances d'une collision GUID sont plus petites que les chances d'un rayon cosmique retournant un peu dans la mémoire de votre ordinateur et bousillant la réponse donnée par n'importe quel algorithme "précis" que vous voudriez exécuter. (Voir cette réponse StackOverflow pour les mathématiques.)

Il existe un énorme nombre de GUID. Pour citer le guide de l'auto-stoppeur de la galaxie de Douglas Adams :

"L'espace", dit-il, "est grand. Vraiment grand. Vous ne croirez tout simplement pas à quel point il est énormément énorme. Je veux dire que vous pensez peut-être que c'est un long chemin vers le chimiste, mais ce ne sont que des arachides dans l'espace , écoute… "

Et puisqu'il y a environ 7 × 1022 étoiles dans l'univers , et un peu moins de 2128 GUID, puis il y a environ 4,86 ​​× 1015— Presque cinq quadrillions - GUID pour chaque étoile. Si chacune de ces étoiles avait un monde avec une population prospère comme la nôtre, alors autour de chaque étoile, chaque humain ou étranger qui a déjà véc aurait droit à plus de 45 000 GUID. Pour chaque personne de l'histoire à chaque étoile de l'univers. L'espace GUID est au même niveau d'immensité que la taille de l'univers entier. Vous n'avez pas besoin de vous inquiéter.

( Edit 2: Réfléchissant à ceci: wow. Je n'avais pas réalisé moi-même ce que cela signifiait. L'espace GUID est incompréhensiblement massif. J'en suis en admiration.)

332

Réponse courte: pour des raisons pratiques, oui.

Cependant, vous devez considérer le paradoxe de l'anniversaire!

J'ai calculé quelques probabilités de collision représentatives. Avec les UUID de 122 bits spécifiés dans l'article Wikipedia , la probabilité de collision est de 1/2 si vous générez au moins 2.71492e18 UUID. Avec 10 ^ 19 UUID, la probabilité est de 0,999918. Avec 10 ^ 17 UUID, 0,000939953.

Quelques chiffres pour comparaison peuvent être trouvés sur Wikipedia. Vous pouvez donc attribuer en toute sécurité un UUID pour chaque humain qui a vécu, chaque galaxie dans l'univers observable, chaque poisson dans l'océan et chaque fourmi individuelle sur Terre . Cependant , les collisions sont presque certaines si vous générez un UUID pour chaque transistor que l'humanité produit en un an, chaque insecte sur Terre, chaque grain de sable sur Terre, chaque étoile dans l'univers observable, ou quelque chose de plus grand.

Si vous générez 1 milliard d'UUID par seconde, cela prendrait environ 36 ans pour obtenir une probabilité de collision de 10%.

Finalement, il y aura probablement une collision entre l'ensemble des UUID générés au cours de l'histoire humaine. Pourtant, la probabilité que les UUID entrés en collision soient utilisés dans le même but est extrêmement faible, il n'y a donc pas de problème dans la pratique.

38
Mechanical snail

Une analyse de la possibilité de collision est disponible sur Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

Comme mentionné dans le lien, cela sera affecté par les propriétés du générateur de nombres aléatoires.

Il y a aussi la possibilité d'un bug dans GUID code générateur; alors que les chances sont faibles, elles sont probablement plus élevées que les chances de collision basées sur les mathématiques.

Un filtre Bloom pourrait être approprié; il peut rapidement vous dire si un GUID est unique, mais il y a un risque de fausse indication d'une collision. Une autre méthode si vous testez un lot à la fois consiste à trier le lot et comparer chaque élément successif.

8
Mark Ransom

En général, oui, il est sûr de supposer.

Si votre générateur GUID est vraiment aléatoire, les possibilités de conflit au sein de 1000 GUID sont extraordinairement petites.

Bien sûr, cela suppose un bon générateur GUID. La question est donc de savoir à quel point vous faites confiance à l'outil que vous utilisez pour générer GUID et le fait-il) avoir ses propres tests?

5
Haacked

Bien qu'une collision soit possible, elle est TRÈS improbable. (Math ici .) Il est sûr de supposer qu'ils sont en fait distincts.

0
VeeArr
0
Brad