Un GUID est-il unique à 100% du temps?

519

Un GUID est-il unique à 100% du temps?

Restera-t-il unique sur plusieurs threads?

David Basarab
la source
265
Non, pas à 100% ... seulement 99,999999999999999999999999999999999999999999999999999999999999999999999999999%;)
JohannesH
52
Tout d'abord, un GUID n'est pas infini, ce qui signifie que pour la signification littérale de "100% du temps", cela signifierait que peu importe combien de temps vous continuez à générer des GUID, ils seraient toujours uniques. Ce n'est pas le cas. De plus, depuis l'implémentation d'origine, où la carte réseau unique série / id / MAC a été utilisée pour produire une partie de la clé n'est plus utilisée, pour diverses raisons, un GUID n'est plus vraiment unique au monde . Il est cependant localement unique. En d'autres termes, si vous continuez à générer des GUID sur une seule machine, vous n'obtiendrez pas de doublons.
Lasse V. Karlsen
36
@ojrac J'ai juste choisi d'arrondir ...: P
JohannesH
403
Chaque fois que je génère un GUID, j'ai l'impression d'en voler un dans l'univers. Parfois, je pense à des gens pervers qui génèrent beaucoup plus de GUID qu'ils n'en ont besoin et ces GUID gaspillés ne sont donc plus utilisés ou générés à nouveau ...
asavartsov
29
@asavartsov Je pense que vous aimerez wasteaguid.info ^ _ ^
Navin

Réponses:

431

Bien que chaque GUID généré ne soit pas garanti d'être unique, le nombre total de clés uniques (2 128 ou 3,4 × 10 38 ) est si grand que la probabilité qu'un même nombre soit généré deux fois est très faible. Par exemple, considérons l'univers observable, qui contient environ 5 × 10 22 étoiles; chaque étoile pourrait alors avoir 6,8 × 10 15 GUID universellement uniques.

De Wikipédia .


Voici quelques bons articles sur la façon dont un GUID est créé (pour .NET) et comment vous pouvez obtenir le même GUID dans la bonne situation.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

La

Adam Davis
la source
115
Ne seraient-ils pas alors appelés UUID? ;)
Arafangion
28
Un GUID est l'implémentation spécifique de Microsoft de la norme UUID. Donc, c'est les deux. ID global unique vs ID universel unique.
Adam Davis
40
Techniquement, ce n'est pas 2 ^ 128, car dans un GUID v4, vous avez un chiffre hexadécimal qui sera toujours un 4 (en supprimant effectivement 4 bits), et deux bits plus loin sont également réservés. Cependant, 2 ^ 122 GUID V4 valides laissent encore environ 5x10 ^ 36, ce qui fera l'affaire pour moi. et pour toi aussi. Chaque étoile devra accepter environ 1,1 x 10 ^ 14 GUID chacun.
Andrew Shelansky
67
Si vous êtes comme moi, alors vous aurez envie de savoir 2^128écrit est environ de : 34,028,236,692,093,846,346,337,460,743,177,000,000. Statistiquement, si vous avez calculé 1000 GUID par seconde, il faudrait encore des milliers d'années pour obtenir un doublon.
Entité
26
Je pensais juste que c'était drôle de le lire alors amusez-vous ici :) Trente quatre undécillions vingt huit décillions deux cent trente six nonillion six cent quatre-vingt-dix deux octillion quatre-vingt-dix trois septillion huit cent quarante-six sextillion trois cent quarante-six quintillion trois cent trente sept quadrillion quatre cent soixante mille milliards sept cent quarante trois milliards cent soixante-dix sept millions
hjavaher
85

Si vous avez peur des mêmes valeurs GUID, placez-en deux l'une à côté de l'autre.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Si vous êtes trop paranoïaque, mettez-en trois.

Bura Chuhadar
la source
64
Vous devez être très, très, très, très paranoïaque pour ajouter 3 GUID.
harsimranb
25
@harsimranb Non ... très, très, très, très paranoïaque, c'est 6 GUID. Paranoïde est une annexe, très paranoïde est deux
annexes
37
@Suamere J'ai créé un site Web pour calculer votre niveau paranoïaque jogge.github.io/HowParanoidAmI
Jogge
3
@Jogge xD C'est incroyable, lol. Après 9 9 999999999dans votre formulaire, je pense que Paranoia éclatera mon navigateur.
Suamere
66

La réponse simple est oui.

Raymond Chen a écrit un excellent article sur les GUID et pourquoi les sous-chaînes de GUID ne sont pas garanties uniques. L'article explique en détail la façon dont les GUID sont générés et les données qu'ils utilisent pour garantir l'unicité, ce qui devrait expliquer en détail pourquoi ils sont :-)

ljs
la source
23
Je pense que l'article de Chen fait référence à la V1 de l'algorithme de génération GUID, qui utilise une adresse MAC et un horodatage - le V4 actuel utilise plutôt un nombre pseudo-aléatoire: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett
2
le lien est mort - 403 Interdit
daya
Voici le lien: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
39

En remarque, je jouais avec les GUID de volume dans Windows XP. Il s'agit d'une disposition de partition très obscure avec trois disques et quatorze volumes.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Ce n'est pas que les GUID sont très similaires, mais le fait que tous les GUID contiennent la chaîne "mario". Est-ce une coïncidence ou y a-t-il une explication derrière cela?

Maintenant, lors de la recherche sur Google pour la partie 4 du GUID, j'ai trouvé environ 125 000 hits avec des GUID de volume.

Conclusion: en ce qui concerne les GUID de volume, ils ne sont pas aussi uniques que les autres GUID.

Jonas Gulle
la source
31
Vous vous souvenez de l'annonce Super Mario Bros 3 des années 80? Tous ces gens criant "Mario! Mario! Mario!" partout dans le monde a un peu bouleversé le caractère aléatoire de l'univers.
MGOwen
24
Si vous désinstallez manuellement Office 2010 avec msiexec, il répertorie tous les GUID MSI du programme Office. Ils épelent tous 0FF1CE. On dirait que Microsoft a une interprétation assez ... lâche ... de la façon de générer un GUID;)
Mark Henderson
3
Ces GUID de partition ont tous été créés ensemble le 2009-12-17 à 14h47: 45 UTC. Ils sont uniques à votre machine, mais mettre "mario" comme identifiant de nœud est incorrect - cela signifie qu'ils ne sont pas conformes à la RFC-4122. De même, les 0FF1CEGUID relèvent de la section «Compatibilité descendante NCS» de la RFC-4122, mais il est peu probable que Microsoft suive les règles NCS pour ces valeurs.
Stephen Cleary
16
Je le savais, la Nintendo Security Administration a compromis les générateurs de nombres aléatoires.
MetaGuru
1
c'est peut-être ce même parc de balle que le nom de la société qui fabrique une eau minérale (entendu qu'ils dirigent le marché) Evian. L'orthographe en arrière donne Naive :-)
Mariusz
31

Cela ne devrait pas arriver. Cependant, lorsque .NET est soumis à une lourde charge, il est possible d'obtenir des GUID en double. J'ai deux serveurs Web différents utilisant deux serveurs SQL différents. Je suis allé fusionner les données et j'ai découvert que j'avais 15 millions de guides et 7 doublons.

Tim
la source
1
Comment est-ce possible sur deux machines différentes? Je pensais qu'une partie du GUID était le nom de la machine? (sans discuter ... je demande juste)
John Cruz
8
Cela ne serait vrai que pour les guides v1 qui utilisent des adresses MAC (pas le nom de la machine) dans le cadre de la génération GUID. Le v4, qui est de facto le STD n'utilise plus d'adresses Mac mais un nombre pseudo aléatoire.
Xander
14
Guid.NewGuidgénère toujours des GUID v4 (et l'a toujours). Tim doit avoir eu des sources d'entropie extrêmement pauvres.
Stephen Cleary
1
Est-ce que cela a déjà été reproduit? c'est un énorme problème si c'est le cas.
Zyo
1
Même chose ici lors de l'importation de très grands ensembles de données. De 10 à 100 millions environ, vous obtenez des doublons de Guid.NewGuid
Stephan Baltzer
28

Oui, un GUID doit toujours être unique. Il est basé sur le matériel et le temps, plus quelques bits supplémentaires pour vous assurer qu'il est unique. Je suis sûr qu'il est théoriquement possible de se retrouver avec deux identiques, mais extrêmement peu probable dans un scénario réel.

Voici un excellent article de Raymond Chen sur Guids:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

Eric Z Beard
la source
5
Cet article est assez ancien et fait référence à la v1 des GUID. v4 n'utilise pas de matériel / temps mais un algorithme de nombres aléatoires à la place. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham
Ce lien est rompu
Marcel
Voici le lien: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
23

Les guides sont statistiquement uniques. Les chances que deux clients différents génèrent le même Guid sont infiniment petites (en supposant qu'aucun bogue dans le code de génération de Guid). Vous pouvez aussi vous inquiéter des problèmes de votre processeur dus à un rayon cosmique et décider que 2 + 2 = 5 aujourd'hui.

Plusieurs threads allouant de nouveaux guides obtiendront des valeurs uniques, mais vous devriez obtenir que la fonction que vous appelez soit thread-safe. Dans quel environnement est-ce?

Rob Walker
la source
19

Eric Lippert a écrit une série très intéressante d'articles sur les GUID.

Il y a de l'ordre de 2 30 ordinateurs personnels dans le monde (et bien sûr de nombreux appareils portables ou non-PC qui ont plus ou moins les mêmes niveaux de puissance de calcul, mais laissons de côté ces derniers). Supposons que nous mettons tous ces PC du monde à la tâche de générer des GUID; si chacun peut générer, disons, 2 20 GUID par seconde, puis après seulement environ 2 72 secondes - cent cinquante mille milliards d'années - vous aurez une très forte chance de générer une collision avec votre GUID spécifique. Et les chances de collision deviennent plutôt bonnes après seulement trente mille milliards d'années.

Paolo Moretti
la source
28
... et il continue dans le paragraphe suivant: "Mais cela cherche une collision avec un GUID spécifique. [...] Donc, si nous mettons ces milliards de PC au travail en générant des GUID à 122 bits de hasard, la probabilité que deux d'entre eux quelque part là-dedans entreraient en collision devient vraiment élevé après la génération d'environ 2 ^ 61 GUID. Puisque nous supposons qu'environ 2 ^ 30 machines font 2 ^ 20 GUID par seconde, nous nous attendons à une collision après environ 2 ^ 11 secondes, soit environ une heure . " (Et enfin, il explique que, bien sûr, pas beaucoup de GUID sont générés.)
Arjan
16

Théoriquement, non, ils ne sont pas uniques. Il est possible de générer un guid identique à plusieurs reprises. Cependant, les chances que cela se produise sont si faibles que vous pouvez supposer qu'elles sont uniques.

J'ai lu auparavant que les chances sont si faibles que vous devriez vraiment insister sur autre chose - comme votre serveur qui brûle spontanément ou d'autres bogues dans votre code. C'est-à-dire, supposez qu'il est unique et ne construisez pas de code pour "attraper" les doublons - passez votre temps sur quelque chose de plus susceptible de se produire (c'est-à-dire autre chose).

J'ai tenté de décrire l'utilité des GUID pour mon audience de blog (membres de la famille non techniques). De là (via Wikipedia), les chances de générer un GUID en double:

  • 1 sur 2 ^ 128
  • 1 undecillion sur 340 (ne vous inquiétez pas, undecillion n'est pas sur le quiz)
  • 1 sur 3,4 × 10 ^ 38
  • 1 sur 340 000 000 000 000 000 000 000 000 000 000 000 000 000
Michael Haren
la source
1
En fait, je ne suis pas d'accord sur le fait de "ne pas s'en inquiéter", bien que d'un point de vue différent: si vous détectez une collision GUID, alors quelque chose a mal tourné avec votre application. J'ai utilisé des GUID, par exemple, pour l'idempotence, et j'ai eu une collision lorsqu'une commande a été envoyée deux fois (avec le même GUID).
Kenny Hung
9

Aucun ne semble mentionner le calcul réel de la probabilité qu'il se produise.

Tout d'abord, supposons que nous pouvons utiliser tout l'espace de 128 bits (Guid v4 n'utilise que 122 bits).

Nous savons que la probabilité générale de NE PAS obtenir de doublon dans les nsélections est:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )

Parce que 2 128 est beaucoup plus grand que n, nous pouvons l'approcher:

(1-1 / 2 128 ) n (n-1) / 2

Et parce que nous pouvons supposer qu'il nest beaucoup plus grand que 0, nous pouvons l'approcher pour:

(1-1 / 2 128 ) n ^ 2/2

Maintenant, nous pouvons assimiler cela à la probabilité "acceptable", disons 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Que nous résolvons net obtenons:

n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))

Quel Wolfram Alpha arrive à être 5.598318 × 10 19

Pour mettre ce nombre en perspective, prenons 10000 machines, chacune ayant un processeur à 4 cœurs, faisant 4 GHz et dépensant 10000 cycles pour générer un Guid et ne rien faire d'autre. Il faudrait alors ~ 111 ans avant de générer un doublon.

Ciné
la source
J'ai modifié votre message en suivant ce message - veuillez modifier si j'ai fait une erreur;).
shA.t
Salut @Cine, j'ai le pouvoir de modifier votre réponse, mais j'ai choisi de ne pas le faire parce que je veux avoir une chance pour vous de le réfuter en premier, je viendrai probablement dans un mois pour le changer officiellement si je ne le fais pas '' t entendre de vous. Je suis à peu près certain que vos calculs sont faux. l'équation réelle pour déterminer une chance de 1% est la suivante: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = .01. Votre exposant a tort. ce n'est pas seulement n. Vous avez besoin de C (n, 2) (aka (n * (n-1)) / 2) pour calculer toutes les combinaisons lorsque vous générez des "n" guides. Voir ici pour plus d'informations
viggity
Merci Ciné, moi aussi j'ai fini par approcher n ^
2/2
Il faudrait 10000 machines 111 ans pour générer chaque GUID possible, puis générer un doublon. Un doublon se produirait cependant bien avant que tous les GUID possibles aient été générés. Je pense que le délai approximatif dépendrait de la façon «aléatoire» du processus de génération de GUID.
George K
@GeorgeK Je pense que vous avez mal compris ... Il faudrait 10000 machines 111 ans pour avoir 1% de chance de rencontrer un doublon. Mais oui, cette mathématique suppose bien sûr que le générateur aléatoire est totalement aléatoire.
Cine
7

Depuis http://www.guidgenerator.com/online-guid-generator.aspx

Qu'est-ce qu'un GUID?

GUID (ou UUID) est un acronyme pour «Globally Unique Identifier» (ou «Universally Unique Identifier»). Il s'agit d'un nombre entier de 128 bits utilisé pour identifier les ressources. Le terme GUID est généralement utilisé par les développeurs travaillant avec les technologies Microsoft, tandis que l'UUID est utilisé partout ailleurs.

À quel point un GUID est-il unique?

128 bits est suffisamment grand et l'algorithme de génération est suffisamment unique pour que si 1 000 000 000 de GUID par seconde soient générés pendant 1 an, la probabilité d'un doublon ne serait que de 50%. Ou si chaque humain sur Terre générait 600 000 000 de GUID, il n'y aurait qu'une probabilité de 50% de doublon.

Tono Nam
la source
7
la probabilité d'un doublon n'est-elle pas suffisamment élevée pour provoquer la peur?
disklosr
1
@disklosr oui c'est suffisant pour faire peur si vos systèmes génèrent 1 milliard de GUID par seconde. Dans le cas extrêmement improbable où vous générez ce montant, enchaînez simplement deux GUID ensemble ...
maxshuty
5

J'ai rencontré un GUID en double.

J'utilise le scanner de bureau Neat Receipts et il est livré avec un logiciel de base de données propriétaire. Le logiciel a une fonction de synchronisation avec le cloud, et j'ai continué à recevoir une erreur lors de la synchronisation. Un coup d'œil aux journaux a révélé la ligne impressionnante:

"erreurs": [{"code": 1, "message": "creator_guid: est déjà pris", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

J'étais un peu incrédule, mais sûrement assez, quand j'ai trouvé un chemin dans ma base de données Neatworks locale et supprimé l'enregistrement contenant ce GUID, l'erreur s'est arrêtée.

Donc, pour répondre à votre question avec des preuves anecdotiques, non. Un doublon est possible. Mais il est probable que la raison pour laquelle cela s'est produit n'était pas due au hasard, mais à la pratique non respectée d'une manière ou d'une autre. (Je n'ai tout simplement pas cette chance) Cependant, je ne peux pas dire avec certitude. Ce n'est pas mon logiciel.

Leur service client était EXTRÊMEMENT courtois et serviable, mais ils n'ont jamais rencontré ce problème auparavant car après plus de 3 heures au téléphone avec eux, ils n'ont pas trouvé la solution. (FWIW, je suis très impressionné par Neat, et ce problème, bien que frustrant, n'a pas changé mon opinion sur leur produit.)

exintrovert
la source
19
Ne croyez pas que vous en ayez un double. Il y avait probablement quelque chose d'autre impliqué, comme le nombre n'était pas vraiment aléatoire ou un problème dans le processus de synchronisation, ou le système a essayé d'enregistrer deux fois, etc. Un problème logiciel est beaucoup plus probable que vous obtenez un GUID en double.
orad
4

MSDN :

Il y a une très faible probabilité que la valeur du nouveau Guid soit entièrement nulle ou égale à tout autre Guid.

Jakub Šturc
la source
4

Si votre horloge système est correctement configurée et n'a pas été bouclée, et si votre NIC a son propre MAC (c'est-à-dire que vous n'avez pas défini de MAC personnalisé) et que votre fournisseur de NIC n'a pas recyclé les MAC (ce qu'ils ne sont pas censés faire mais qui est connu pour se produire), et si la fonction de génération de GUID de votre système est correctement implémentée, votre système ne générera jamais de GUID en double.

Si tout le monde sur terre qui génère des GUID suit ces règles, alors vos GUID seront globalement uniques.

Dans la pratique, le nombre de personnes qui enfreignent les règles est faible et il est peu probable que leurs GUID "s'échappent". Les conflits sont statistiquement improbables.

DrPizza
la source
11
Cela ne serait vrai que pour les guides v1. Le v4, qui est de facto le STD n'utilise plus d'adresses Mac mais un nombre pseudo aléatoire.
Pita.O
1
"alors votre système ne générera jamais de GUID en double" Même si toutes les règles ont été suivies pour un guide v1 comme vous le dites, votre système pourrait toujours générer des doublons. Vous êtes plus correct en bas lorsque vous déclarez «les conflits sont statistiquement improbables».
Nick Meldrum le
3

Un GUID est-il unique à 100% du temps?

Non garanti, car il existe plusieurs façons d'en générer un. Cependant, vous pouvez essayer de calculer la possibilité de créer deux GUIDs qui sont identiques et vous obtenez l'idée: un GUID a 128 bits, par conséquent, il y a 2 128 GUIDs distincts - beaucoup plus d' étoiles dans l'univers connu. Lisez l' article wikipedia pour plus de détails.

Konrad Rudolph
la source
2

Dans un sens plus général, ceci est connu comme le "problème d'anniversaire" ou "paradoxe d'anniversaire". Wikipedia a une assez bonne vue d'ensemble sur: Wikipedia - Problème d'anniversaire

En termes très approximatifs, la racine carrée de la taille du pool est une approximation approximative du moment où vous pouvez vous attendre à 50% de chances d'un doublon. L'article comprend une table de probabilité de la taille du pool et diverses probabilités, dont une ligne pour 2 ^ 128. Donc, pour une probabilité de collision de 1%, vous vous attendez à choisir au hasard des nombres de 2,6 * 10 ^ 18 128 bits. Une chance de 50% nécessite 2,2 * 10 ^ 19 choix, tandis que SQRT (2 ^ 128) est de 1,8 * 10 ^ 19.

Bien sûr, ce n'est que le cas idéal d'un processus vraiment aléatoire. Comme d'autres l'ont mentionné, beaucoup dépend de cet aspect aléatoire - à quel point le générateur et la graine sont-ils bons? Ce serait bien s'il y avait un support matériel pour aider à ce processus qui serait plus à l'épreuve des balles, sauf que tout peut être usurpé ou virtualisé. Je soupçonne que cela pourrait être la raison pour laquelle les adresses MAC / horodatages ne sont plus incorporés.

mszil
la source
Je pense que le problème MAC était l'anonymat. Je pense que l'utilisation d'un identifiant tel qu'une adresse MAC d'une manière qui pourrait être inversée était un problème de confidentialité. Je crois que le vrai hasard dans le matériel est très difficile? Cloudflare utilise un appareil photo et une rangée de lampes à lave, mais je pense qu'avec une compréhension précise de la physique, même ce n'est pas aléatoire? Lampe à lave Cloudflares RNG: popularmechanics.com/technology/security/news/a28921/…
Jeff Block
2

Pour un meilleur résultat, la meilleure façon est d'ajouter le GUID avec l'horodatage (juste pour s'assurer qu'il reste unique)

Guid.NewGuid().ToString() + DateTime.Now.ToString();
Adithya Sai
la source
Et si vous obtenez deux collisions dans la même seconde?
Wai Ha Lee
C'est le pire des cas, mais nous ne pouvons toujours pas générer les deux mêmes Guid en même temps.
Adithya Sai
Quelque part, ils soutiennent que l'on devrait copier de la réponse sur SO, pas la question, mais je ne suis pas si sûr maintenant ...
Marcel
Que diriez-vous de Guid.NewGuid (). ToString (). Replace ("-", "") + DateTime.Now.Ticks .... Non discutable sur l'unicité et peut être utilisé comme clé primaire
d-coder Il y a
1

Les algorithmes GUID sont généralement implémentés conformément à la spécification GUID v4, qui est essentiellement une chaîne pseudo-aléatoire. Malheureusement, ceux-ci entrent dans la catégorie des "probablement non uniques" de Wikipédia (je ne sais pas pourquoi tant de gens ignorent ce bit): "... d'autres versions GUID ont des propriétés et des probabilités d'unicité différentes, allant de l'unicité garantie à la non-unicité probable. "

Les propriétés pseudo-aléatoires du JavaScript de V8 Math.random()sont TERRIBLES à l'unicité, avec des collisions venant souvent après seulement quelques milliers d'itérations, mais V8 n'est pas le seul coupable. J'ai vu des collisions GUID réelles utilisant à la fois les implémentations PHP et Ruby des GUID v4.

Parce qu'il devient de plus en plus courant de faire évoluer la génération d'ID sur plusieurs clients et clusters de serveurs, l'entropie prend un grand coup - les chances que la même graine aléatoire soit utilisée pour générer une ID augmentent (le temps est souvent utilisé comme graine aléatoire dans les générateurs pseudo-aléatoires), et les collisions GUID passent de "probablement non unique" à "très susceptible de causer beaucoup de problèmes".

Pour résoudre ce problème, j'ai décidé de créer un algorithme d'identification pouvant évoluer en toute sécurité et offrir de meilleures garanties contre les collisions. Il le fait en utilisant l'horodatage, un compteur client en mémoire, l'empreinte digitale du client et des caractères aléatoires. La combinaison de facteurs crée une complexité additive qui est particulièrement résistante à la collision, même si vous la mettez à l'échelle sur un certain nombre d'hôtes:

http://usecuid.org/

Eric Elliott
la source
1

J'ai constaté que les GUID n'étaient pas uniques lors des tests unitaires multi-threads / multi-processus (aussi?). Je suppose que cela a à voir avec, toutes les autres choses étant égales, l'ensemencement identique (ou le manque d'ensemencement) des générateurs pseudo-aléatoires. Je l'utilisais pour générer des noms de fichiers uniques. J'ai trouvé que le système d'exploitation est bien meilleur pour le faire :)

Alerte de pêche à la traîne

Vous demandez si les GUID sont 100% uniques. Cela dépend du nombre de GUID dont il doit être unique. Comme le nombre de GUID approche de l'infini, la probabilité de doublons de GUID approche 100%.

Robert Jørgensgaard Engdahl
la source
1

La réponse "Un GUID est-il 100% unique?" est tout simplement "Non" .

  • Si vous souhaitez un caractère 100% unique du GUID, procédez comme suit.

    1. générer un GUID
    2. vérifier si ce GUID existe dans la colonne de votre tableau où vous recherchez l'unicité
    3. s'il existe, passez à l'étape 1 sinon à l'étape 4
    4. utilisez ce GUID comme unique.
Baba Khedkar
la source
Cela ne le rend pas unique. Votre algorithme n'enregistre pas le GUID nouvellement créé dans le tableau. La prochaine fois que vous créerez un GUID, il pourrait entrer en collision avec un avant. Si vous deviez insérer le GUID dans la table, le GUID pourrait déjà avoir été inséré par un autre pair entre vous avez vérifié l'unicité et vous avez inséré le GUID dans la table. Le GUID n'est unique qu'au sein de VOTRE système, donc si vous importez ou fusionnez deux bases de données, elles pourraient toujours entrer en collision. Les GUID sont également souvent utilisés lorsque vous n'avez pas accès à une base de données centralisée. Si vous aviez pourquoi ne pas simplement extraire un identifiant de la base de données?
Jogge
0

La partie la plus difficile n'est pas de générer un Guid dupliqué.

La partie la plus difficile est une base de données conçue pour stocker toutes celles générées pour vérifier si elle est réellement dupliquée.

De WIKI:

Par exemple, le nombre d'UUID aléatoires de la version 4 qui doivent être générés pour avoir une probabilité de 50% d'au moins une collision est de 2,71 quintillions, calculé comme suit:

entrez la description de l'image ici

Ce nombre équivaut à générer 1 milliard d'UUID par seconde pendant environ 85 ans, et un fichier contenant ce nombre d'UUID, à 16 octets par UUID, serait d'environ 45 exaoctets, plusieurs fois plus grand que les plus grandes bases de données actuellement en existence, qui sont sur l'ordre de centaines de pétaoctets

Trong Hiep Le
la source
0

GUID signifie Global Unique Identifier

En bref: (l'indice est dans le nom)

En détail: les GUID sont conçus pour être uniques; ils sont calculés à l'aide d'une méthode aléatoire basée sur l'horloge de l'ordinateur et l'ordinateur lui-même, si vous créez de nombreux GUID à la même milliseconde sur la même machine, il est possible qu'ils correspondent, mais pour presque toutes les opérations normales, ils doivent être considérés comme uniques.

Benjamin Roberts
la source