web-dev-qa-db-fra.com

Comment C # génère-t-il des GUID?

Comment les GUID sont-ils générés en C #?

33
Nila

Question originale:

Comment le Guid génère son identifiant ?? Comment sera sa sortie Si j'utilise le code suivant: Guid g = Guid.NewGuid ();

Si le résultat sera la combinaison de chiffres et de lettres ou Les chiffres seuls seront là ???

Un .Net System.Guid est juste un entier de 128 bits (16 octets). Les chiffres et les lettres n'ont rien à voir avec cela. Vous pouvez utiliser la méthode ToString () pour afficher différentes versions "lisibles par un humain" d'un Guid, qui comprennent les chiffres 0 à 9 et les lettres A à F (représentant les valeurs hexadécimales), mais vous ne pouvez décider de le générer.

10
Dave Mateer

Il existe un très bon article ici qui décrit la manière dont les GUID sont générés, et en particulier la raison pour laquelle une sous-chaîne d'un GUID n'est pas garantie comme étant unique.

Basiclly un GUID est généré en utilisant une combinaison de

  • Adresse MAC de la machine utilisée pour générer le GUID (les GUID générés sur différentes machines sont donc uniques, à moins que les adresses MAC ne soient réutilisées).
  • Horodatage (les GUID générés à des moments différents sur le même ordinateur sont donc uniques)
  • Extra "bits uniquificateur d'urgence" (ils sont utilisés pour garantir que les GUID générés presque au même moment sur la même machine sont uniques)
  • Un identifiant pour l'algorithme (afin que les GUID générés avec un algorithme différent soient uniques)

Cependant, il ne s'agit que d'un algorithme particulier utilisé pour générer des GUID (bien que je crois que c'est celui utilisé par le framework .Net), et n'est pas celui utilisé par le framework .Net

41
Justin

L'algorithme est documenté ici sous la forme/ Identificateur global unique

13
David

Il existe également d'autres formes de GUID en plus de "16 octets aléatoires", comme indiqué dans le RFC. Certains produits Microsoft (SQL Server par exemple) peuvent éventuellement générer ces "GUID séquentiels" basés sur une combinaison de "l'adresse MAC de la première carte réseau du système + un compteur toujours croissant, en fonction de l'heure système".

Ces "GUID séquentiels" ont la propriété Nice d'ajouter systématiquement de nouveaux enregistrements à la "fin" d'une table de base de données lorsqu'ils sont utilisés comme clé primaire de base de données avec un index clusterisé. Cela permet d'éviter la fragmentation de l'index de base de données et les divisions de page.

Si des GUID aléatoires sont utilisés en tant que clés primaires de base de données avec des index en cluster, de nouveaux enregistrements seront insérés de manière aléatoire au "milieu" d'une table du point de vue de l'allocation physique, ce qui aboutit à une fragmentation de l'index et à la saturation partielle des pages de la base de données.

L’utilisation de GUID séquentiels vous permet toujours de générer des GUID de manière indépendante sur plusieurs systèmes et d’être certain qu’il n’y aura pas de collisions (propriété que vous n’obtenez pas en utilisant des entiers séquentiels en tant que clés primaires sans allouer des "plages" ou des valeurs initiales et des incréments différents à chaque système, qui est un cauchemar administratif dans les grandes applications distribuées).

1
rmalayter

Les bits du GUID se décomposent comme ceci:

  • 60 bits d'horodatage
  • 48 bits d'identifiant d'ordinateur
  • 14 bits d'uniquificateur
  • 6 bits sont fixés

Total de 128 bits.

0
Prince Prasad

Détails sur Wikipedia et MSDN .

En bref, un GUID est un entier aléatoire de 128 bits, mais nous les formons à l'aide de chiffres hexadécimaux pour qu'ils soient facilement lisibles (il s'agit du format 8-4-4-4-12 que vous voyez). . En ce qui concerne la façon dont il est généré, voir l’article lié à Wikipedia.

0
jason