Question Deux threads du même processus peuvent-ils produire le même GUID?


Si deux threads d'un processus génèrent un nouveau GUID simultanément à l'aide de l'API .NET (Guid.NewGuid()) est-il possible que les deux GUID soient identiques?

Merci.

METTRE À JOUR Je veux être pratique. Je sais qu'il est largement admis que les GUID sont uniques à toutes fins pratiques. Je me demande si je peux traiter les GUIDS produits par les différents threads du même processus de la même manière.


16
2018-05-13 14:02


origine


Réponses:


Réponse courte

Possible (comme dans, pourrait-il déjà arriver, dans la vie de l'univers)? Oui.

Probable (à tout)? Non.


Réponse plus longue

Microsoft utilise un Algorithme version 4 pour générer des GUID (voir aussi: ici), qui produit un nombre complètement (pseudo) aléatoire.

Compte tenu du nombre de GUID possibles, le probabilité d'un doublon est minuscule Comme, insondable minuscule.

Vous êtes préoccupé par la concurrence: heureusement, le NewGuid la méthode est sans fil, ce qui signifie qu'il verrouille ou utilise un générateur de nombres aléatoires statique pour ses besoins. La première approche sérialiserait efficacement tous les appels à NewGuid de sorte qu'ils se produisent en séquence (jamais en même temps) alors que ces derniers feraient des appels à partir de threads distincts indépendants les uns des autres.

Dans les deux cas, la seule raison pour laquelle vous auriez à craindre de recevoir des doublons de deux threads créant simultanément des nombres aléatoires - GUID ou non - serait si les générateurs sous-jacents utilisés par les threads fonctionnaient (1) à partir de la même graine (qui ne pouvait résulter que d'un défaut de conception), et (2) en fonction du temps (ce que ne fait pas l'algorithme GUID version 4).

Donc oui, en pratique, vous pouvez traiter les GUID générés simultanément à partir de threads distincts comme étant uniques.


27
2018-05-13 14:05



Pas possible. Méthodes statiques de Guid sont garantis pour être thread-safe. Voir la documentation ici.


7
2018-05-13 14:07



Il est peu probable que cela se produise ...

http://msdn.microsoft.com/en-gb/library/system.guid(v=VS.95).aspx

Tous les membres publics static (Shared en Visual Basic) de ce type sont thread-safe. Tous les membres de l'instance ne sont pas garantis pour être thread-safe. [...]

Un GUID est un entier de 128 bits (16 octets)   qui peut être utilisé sur tous les ordinateurs   et réseaux partout où un unique   identifiant est requis. Un tel   l'identifiant a une probabilité très faible   d'être dupliqué.


1
2018-05-13 14:08



Eh bien, les implémentations actuelles de l'utilisation de .Net CoCreateGuid intérieurement:

Pour une très grande certitude, cette fonction renvoie une valeur unique - aucune autre invocation, sur le même système ou sur tout autre système (en réseau ou non), ne doit renvoyer la même valeur.


1
2018-05-13 14:31