Question

Est un GUID unique 100% du temps?

Va-il rester unique sur plusieurs threads?

Était-ce utile?

La solution

Bien que chaque GUID généré n'est pas garantie unique, le total des nombre de clés uniques (2128 ou 3.4×1038) est si grande que la probabilité d'un même nombre généré deux fois, c'est très petit.Pour exemple, considérons le observables l'univers, qui contient environ 5×1022 les étoiles;chaque étoile pourrait alors avoir 6.8×1015 universellement unique Guid.

À partir de Wikipédia.


Ce sont quelques bons articles sur la façon dont un GUID est faite (par .NET) et comment vous pourriez 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/

​​

Autres conseils

La réponse simple est oui.

Raymond Chen a écrit un excellent article sur les Guid et pourquoi des sous-chaînes de Guid pas garantie unique.L'article passe en profondeur de la façon dont les Guid sont générés et les données qu'ils utilisent pour s'assurer de l'unicité, qui devrait aller à une certaine longueur en expliquant pourquoi ils sont :-)

Si vous avez peur des mêmes valeurs GUID puis mettre deux d'entre eux, les uns à côté des autres.

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

Si vous êtes trop paranoïaque puis mettre trois.

Comme une note de côté, j'ai été jouer avec les Guid du Volume dans Windows XP.C'est un très obscure disposition de partition 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 semblables, mais le fait que tous les Guid ont la chaîne de "mario" dans les.C'est qu'une coïncidence ou est-il une explication derrière tout cela?

Maintenant, quand googler pour la partie 4 dans le GUID j'ai trouvé environ 125.000 hits avec les Guid du volume.

Conclusion: Quand il s'agit de Guid du Volume qu'ils ne sont pas aussi unique que d'autres Guid.

Oui, un GUID doit toujours être unique.Il est basé à la fois sur le matériel et l'heure, ainsi que quelques-unes des bits supplémentaires pour s'assurer qu'il est unique.Je suis sûr que c'est théoriquement possible de se retrouver avec deux images identiques, mais extrêmement peu probable que, dans un monde réel scénario.

Voici un excellent article de Raymond Chen sur Guid:

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

Il ne devrait pas arriver.Toutefois, lorsque .NET est sous une charge lourde, il est possible d'obtenir un double de guid.J'ai deux serveurs web à l'aide de deux serveurs sql.Je suis allé à fusionner les données et j'ai trouvé que j'avais de 15 millions de guid et 7 doubles.

Les guid sont statistiquement unique.Les chances de deux clients différents, générant le même Guid sont infiniment petite (en supposant qu'aucun des bugs dans le Guid de la génération de code).Vous pouvez ainsi vous soucier de votre processeur glitching en raison d'un rayon cosmique et en décidant que 2+2=5 aujourd'hui.

Plusieurs threads de l'attribution de nouveaux guid obtiendrez des valeurs uniques, mais vous devriez obtenir que la fonction que vous appelez est thread-safe.Dans quel environnement est-ce?

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

Il y a de l'ordre de 230 les ordinateurs personnels dans le monde (et de sûr de nombreux appareils portatifs ou non PC, de périphériques informatiques qui ont plus ou moins les mêmes niveaux de puissance de calcul, mais permet de l'ignorer de ceux-ci).Admettons que nous mettions tous ceux de Pc dans le monde de la objectif de générer un Guid;si chacun peut produire, disons, 220 Guid par deuxième, puis après seulement 272 secondes -- cent cinquante billions d'années -- vous aurez un très haute la probabilité d'obtenir un collision avec votre GUID spécifique.Et les chances de collision obtenir assez bonne après seulement trente millions d'années.

En théorie, non, ils ne sont pas uniques.Il est possible de générer un nombre identique de guid de plus et plus.Cependant, les chances que cela se produise sont si bas que vous pouvez supposer qu'ils sont uniques.

J'ai lu avant que les chances sont si faibles que vous devriez vraiment le stress à autre chose-comme votre serveur spontanément de combustion ou d'autres erreurs dans votre code.C'est assumer qu'il est unique et ne pas construire n'importe quel code pour "attraper" les doublons--de passer du temps sur quelque chose de plus susceptible de se produire (c'est à dire rien d'autre).

J' fait une tentative pour décrire l'utilité de Guid sur mon blog public (non-technique personnes).À partir de là (via Wikipedia), les chances d'obtenir un duplicata GUID:

  • 1 à 2^128
  • 1 340 undecillion (ne vous inquiétez pas, undecillion n'est pas sur la quiz)
  • 1 3,4 × 10^38
  • 1 dans 340,000,000,000,000,000,000,000,000,000,000,000,000

Aucune ne semble mentionner le réel en mathématiques de la probabilité qu'il se produise.

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

Nous savons que le général probabilité de ne PAS obtenir un duplicata n choisit est:

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

Parce que 2128 est beaucoup, beaucoup plus grand que n, on peut approximer ce:

(1-1/2128)n(n-1)/2

Et parce que nous pouvons supposer n est beaucoup, beaucoup plus grand que 0, on peut approximer que à:

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

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

(1-1/2128)n^2/2 = 0.01

Qui nous résolvons pour n et obtenez:

n = sqrt(2* log 0.01 / log (1-1/2128))

Qui Wolfram Alpha est 5.598318 × 1019

Pour mettre ce chiffre en perspective, permet de prendre 10000 machines, chacune ayant un 4 core CPU, de faire 4Ghz et les dépenses de 10000 cycles pour générer un Guid et ne rien faire d'autre.Il prendrait ~111 ans avant de générer un double.

À partir de http://www.guidgenerator.com/online-guid-generator.aspx

Qu'est ce qu'un GUID?

GUID (ou l'UUID) est un acronyme pour "Identificateur Unique" (ou " Universally Unique Identifier).C'est une 128 bits nombre entier utilisé pour identifier les ressources.Le terme GUID est généralement utilisé par les développeurs de travail avec les technologies de Microsoft, tandis que l'UUID est utilisé partout ailleurs.

Comment unique est un GUID?

128-bits est assez grand et la génération de l'algorithme est assez unique que si 1 000 000 000 d'Guid par seconde ont été générés pour les 1 an de la probabilité d'un double serait que de 50%.Ou si chaque personne sur Terre a généré 600,000,000 Guid il n'y aurait qu'une probabilité de 50% d'un duplicata.

MSDN:

Il y a une très faible probabilité que la valeur de la nouvelle Guid est tous des zéros ou égale à toute autre Guid.

Si l'horloge de votre système est correctement réglé et n'a pas enroulé autour, et si votre carte réseau possède sa propre adresse MAC (c'est à direvous n'êtes pas coutume MAC) et votre carte vendeur n'a pas été le recyclage des MACs (dont ils ne sont pas censé faire, mais qui a été connu pour se produire), et si votre système est GUID de la fonction de production est mis en œuvre correctement, votre système ne sera jamais de générer de doublons de Guid.

Si tout le monde sur la terre qui est la génération de Guid suit ces règles, alors votre Guid sera unique au monde.

Dans la pratique, le nombre de personnes qui enfreignent les règles est faible, et leur Guid sont peu susceptibles de "s'échapper".Les conflits sont statistiquement improbable.

J'ai vécu une double GUID.

J'utilise les propres Recettes de scanner de bureau et il est livré avec un logiciel de base de données.Le logiciel dispose d'une synchronisation cloud fonctionnalité, et j'ai continué à obtenir une erreur lors de la synchronisation.Un coup d'œil à l'journaux ont révélé l'incroyable ligne:

les "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 mon local neatworks base de données et supprimer le dossier contenant le GUID, l'erreur cessé de se produire.

Donc, pour répondre à votre question avec les données empiriques, non.Un doublon est possible.Mais il est probable que la raison pour laquelle c'est arrivé n'était pas dû à la chance, mais en raison de la norme de pratique de ne pas être respecté, d'une certaine façon.(Je suis tout simplement pas que de la chance) Cependant, je ne peux pas dire à coup sûr.Ce n'est pas mon logiciel.

Leur soutien à la clientèle a été TRÈS courtois et serviable, mais ils doivent avoir jamais rencontré ce problème avant car après 3 heures au téléphone avec eux, ils n'ont pas trouvé la solution.(FWIW, je suis très impressionné par Soignée, et ce glitch, cependant frustrant, n'est-ce pas modifier mon opinion de leur produit.)

Est un GUID unique 100% du temps?

N'est pas garanti, puisqu'il y a plusieurs façons de produire de l'un.Toutefois, vous pouvez essayer de calculer la possibilité d'en créer deux Guid sont identiques et vous obtenez l'idée:un GUID a 128 bits, d'où, il y a 2128 distinctes Guid – beaucoup plus il y a d'étoiles dans l'univers connu.Lire la article de wikipedia pour plus de détails.

GUID algorithmes sont généralement mises en œuvre selon la v4 GUID cahier des charges, qui est essentiellement une pseudo-aléatoire de la chaîne.Malheureusement, ceux-ci entrent dans la catégorie des "probablement non-unique", à partir de Wikipedia (je ne sais pas pourquoi tant de gens ignorent ce bit):"...d'autres GUID versions sont différentes caractère unique de propriétés et les probabilités, allant de la garantie de l'unicité de susceptibles de non-unicité".

Le pseudo-aléatoires les propriétés de V8 JavaScript Math.random() sont TERRIBLES à l'unicité, avec des collisions venant souvent après seulement quelques milliers d'itérations, mais le V8 n'est pas le seul coupable.J'ai vu dans le monde réel GUID collisions à l'aide de PHP et Ruby implémentations de la version 4 de Guid.

Car il devient de plus en plus fréquent à l'échelle de l'ID de génération entre plusieurs clients, et des grappes de serveurs, de l'entropie prend un grand succès -- les chances de la même graine être utilisé pour générer un ID d'escalade (le temps est souvent utilisé comme une graine de hasard en pseudo-générateurs aléatoires), et GUID collisions escalade "est susceptible de non-unique" à "très susceptible de causer beaucoup d'ennuis".

Pour résoudre ce problème, j'ai décidé de créer un IDENTIFIANT d'algorithme qui pourrait échelle en toute sécurité, et de prendre de meilleures garanties contre les collisions.Il le fait en utilisant le timestamp, en mémoire du client de compteur, le client d'empreintes digitales, et des caractères aléatoires.La combinaison de facteurs crée un additif de la complexité qui est particulièrement résistant à la collision, même si la mise à l'échelle à travers un certain nombre d'hôtes:

http://usecuid.org/

J'ai connu le Guid ne pas être unique au cours de multi-thread et multi-processus de test unitaire (trop?).Je suppose que cela a à voir avec tous les autres réglages étant égales par ailleurs, à l'identique de semis (ou de l'absence de semis) de générateurs pseudo-aléatoires.Je l'utilise pour générer un nom de fichier unique.J'ai trouvé l'OS est beaucoup mieux à faire :)

La pêche à la traîne d'alerte

Vous vous demandez si les Guid sont 100% unique.Cela dépend du nombre de Guid il doit être unique parmi les.Comme le nombre de Guid approche de l'infini, la probabilité de double Guid approche de 100%.

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

Très approximativement, la racine carrée de la taille de la piscine est une approximation de quand vous pouvez vous attendre une chance de 50% d'un duplicata.L'article comprend une table de probabilités de la taille du pool et de diverses probabilités, y compris une ligne pour 2^128.Donc, pour un 1% de probabilité de collision que vous vous attendez à choisir au hasard 2.6*10^18 128 bits.50% de chances exige 2,2*10^19 ramasse, alors que SQRT(2^128) est de 1,8*10^19.

Bien sûr, c'est juste le cas idéal d'un véritable processus aléatoire.Comme d'autres l'ont mentionné, beaucoup est à cheval sur la que aléatoire aspect - quel est le générateur et des semences?Ce serait bien si il y avait un peu de matériel de soutien pour les aider avec ce processus, qui serait plus à l'épreuve des balles, sauf que rien de ce qui peut être usurpée ou virtualisé.Je soupçonne que peut-être la raison pour laquelle les adresses MAC/moment-les timbres ne sont plus intégrés.

La Réponse de "Est un GUID est 100% unique?" est tout simplement "Non" .

  • Si Vous voulez 100% d'unicité de GUID puis faites suivant.

    1. générer GUID
    2. vérifier si ce GUID est Exister dans votre colonne de la table où vous êtes à la recherche pour uniquensess
    3. si existe pas, alors passez à l'étape 1 autre étape 4
    4. utilisez ce GUID unique.

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

La partie la plus difficile est conçu une base de données pour stocker toutes les générés pour vérifier si il est en fait double.

À partir de WIKI:

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

entrez la description de l'image ici

Ce nombre est équivalent à générer 1 milliard de dollars Uuid par seconde à environ 85 ans, et un fichier contenant de nombreux Uuid, à 16 octets par UUID, serait d'environ 45 exaoctets, beaucoup de fois plus grande que la plus grande des bases de données actuellement en existence, qui sont de l'ordre de centaines de pétaoctets

GUID représente un Identifiant Unique Global

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

Dans Le Détail:Les guid sont conçus pour être unique;ils sont calculés à l'aide d'un hasard méthode basée sur les ordinateurs de l'horloge et de l'ordinateur lui-même, si vous êtes à la création de nombreux Guid à la même milliseconde sur la même machine, il est possible qu'ils peuvent correspondre, mais pour presque toutes les opérations normales, ils doivent être considérées comme uniques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top