Aller au contenu principal

4. Specification (Spécification)

4.1. Format

Le format UUID est de 16 octets; certains bits du champ variant de huit octets spécifié ci-dessous déterminent une structure plus fine.

4.1.1. Variant

Le champ variant détermine la disposition de l'UUID. C'est-à-dire que l'interprétation de tous les autres bits de l'UUID dépend du paramétrage des bits dans le champ variant. Le champ variant se compose d'un nombre variable des bits les plus significatifs de l'octet 8 de l'UUID.

Le tableau suivant liste le contenu du champ variant, où la lettre "x" indique une valeur "don't-care".

Msb0Msb1Msb2Description
0xxRéservé, compatibilité arrière NCS
10xLe variant spécifié dans ce document
110Réservé, compatibilité arrière Microsoft Corporation
111Réservé pour définition future

4.1.2. Layout and Byte Order (Disposition et ordre des octets)

Pour minimiser la confusion concernant l'attribution des bits dans les octets, la définition de l'enregistrement UUID n'est définie qu'en termes de champs qui sont des multiples entiers d'octets. Les champs sont présentés avec le plus significatif en premier.

Field (Champ)Data Type (Type de données)Octet #Note
time_lowunsigned 32 bit integer (entier 32 bits non signé)0-3Le champ bas de l'horodatage
time_midunsigned 16 bit integer (entier 16 bits non signé)4-5Le champ médian de l'horodatage
time_hi_and_versionunsigned 16 bit integer (entier 16 bits non signé)6-7Le champ haut de l'horodatage multiplexé avec le numéro de version
clock_seq_hi_and_reservedunsigned 8 bit integer (entier 8 bits non signé)8Le champ haut de la séquence d'horloge multiplexé avec le variant
clock_seq_lowunsigned 8 bit integer (entier 8 bits non signé)9Le champ bas de la séquence d'horloge
nodeunsigned 48 bit integer (entier 48 bits non signé)10-15L'identifiant de nœud spatialement unique

Structure UUID (128 bits):

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4.1.3. Version

Le numéro de version se trouve dans les 4 bits les plus significatifs de l'horodatage (bits 4 à 7 du champ time_hi_and_version).

Le tableau suivant liste les versions actuellement définies pour ce variant UUID:

Msb0-3VersionDescription
00011La version basée sur le temps spécifiée dans ce document
00102Version de sécurité DCE, avec UID POSIX intégrés
00113La version basée sur le nom spécifiée dans ce document utilisant le hachage MD5
01004La version générée aléatoirement ou pseudo-aléatoirement spécifiée dans ce document
01015La version basée sur le nom spécifiée dans ce document utilisant le hachage SHA-1

4.1.4. Timestamp (Horodatage)

L'horodatage est une valeur de 60 bits. Pour l'UUID version 1, ceci est représenté par le Temps Universel Coordonné (UTC) sous forme de nombre d'intervalles de 100 nanosecondes depuis 00:00:00.00, 15 octobre 1582 (la date de la réforme grégorienne du calendrier chrétien).

Pour l'UUID version 3 ou 5, l'horodatage est une valeur de 60 bits construite à partir d'un nom comme décrit dans la section 4.3.

Pour l'UUID version 4, l'horodatage est une valeur de 60 bits générée aléatoirement ou pseudo-aléatoirement, comme décrit dans la section 4.4.

4.1.5. Clock Sequence (Séquence d'horloge)

Pour l'UUID version 1, la séquence d'horloge est utilisée pour aider à éviter les doublons qui pourraient survenir lorsque l'horloge est réglée en arrière dans le temps ou si l'ID de nœud change.

La séquence d'horloge DOIT être initialement (c'est-à-dire une fois dans la durée de vie d'un système) initialisée à un nombre aléatoire pour minimiser la corrélation entre les systèmes.

Pour l'UUID version 3 ou 5, la séquence d'horloge est une valeur de 14 bits construite à partir d'un nom comme décrit dans la section 4.3.

Pour l'UUID version 4, la séquence d'horloge est une valeur de 14 bits générée aléatoirement ou pseudo-aléatoirement.

4.1.6. Node (Nœud)

Pour l'UUID version 1, le champ node se compose d'une adresse MAC IEEE 802, généralement l'adresse de l'hôte. Pour les systèmes avec plusieurs adresses IEEE 802, n'importe quelle adresse disponible peut être utilisée.

Pour l'UUID version 3 ou 5, le champ node est une valeur de 48 bits construite à partir d'un nom comme décrit dans la section 4.3.

Pour l'UUID version 4, le champ node est une valeur de 48 bits générée aléatoirement ou pseudo-aléatoirement.

4.1.7. Nil UUID

L'UUID nil est une forme spéciale d'UUID qui est spécifiée pour avoir tous les 128 bits mis à zéro:

00000000-0000-0000-0000-000000000000

4.2. Algorithms for Creating a Time-Based UUID (Algorithmes de création d'un UUID basé sur le temps)

4.2.1. Basic Algorithm (Algorithme de base)

L'algorithme de base pour générer un UUID basé sur le temps:

  1. Obtenir un verrou global à l'échelle du système
  2. Lire l'heure actuelle
  3. Obtenir l'ID de nœud actuel
  4. Si l'ID de nœud a changé depuis la dernière génération d'UUID, définir la séquence d'horloge à une valeur aléatoire
  5. Si l'heure actuelle est antérieure au dernier horodatage, incrémenter la séquence d'horloge
  6. Sauvegarder l'horodatage et l'ID de nœud
  7. Libérer le verrou global
  8. Formater l'UUID en utilisant l'horodatage, la séquence d'horloge et l'ID de nœud

4.3. Algorithm for Creating a Name-Based UUID (Algorithme de création d'un UUID basé sur un nom)

L'algorithme pour créer un UUID basé sur un nom (version 3 ou version 5):

  1. Allouer un UUID à utiliser comme "ID d'espace de noms" pour tous les UUID générés à partir de noms dans cet espace de noms
  2. Choisir soit MD5 (version 3) soit SHA-1 (version 5) comme algorithme de hachage
  3. Convertir le nom en une séquence canonique d'octets
  4. Calculer le hachage de l'ID d'espace de noms concaténé avec le nom
  5. Définir les octets zéro à 15 aux octets zéro à quinze du hachage
  6. Définir les quatre bits les plus significatifs (bits 12 à 15) de l'octet 6 au numéro de version approprié
  7. Définir les deux bits les plus significatifs (bits 6 et 7) de l'octet 8 respectivement à zéro et un

4.4. Algorithms for Creating a UUID from Truly Random or Pseudo-Random Numbers (Algorithmes de création d'un UUID à partir de nombres vraiment aléatoires ou pseudo-aléatoires)

L'UUID version 4 est destiné à générer des UUID à partir de nombres vraiment aléatoires ou pseudo-aléatoires.

L'algorithme est le suivant:

  1. Définir tous les bits à des valeurs choisies aléatoirement (ou pseudo-aléatoirement)
  2. Définir les quatre bits les plus significatifs (bits 12 à 15) de l'octet 6 au numéro de version 4 bits (0100 binaire)
  3. Définir les deux bits les plus significatifs (bits 6 et 7) de l'octet 8 respectivement à zéro et un

⚠️ Description précise de la logique de masquage de bits:

Pour l'UUID version 4, les opérations de bits précises suivantes DOIVENT être effectuées:

  • Définition des bits de version (Version Bits): Les bits 12-15 de l'octet 6 DOIVENT être définis à 0100 (binaire), soit la valeur décimale 4
  • Définition des bits de variant (Variant Bits): Les bits 6-7 de l'octet 8 DOIVENT être définis à 10 (binaire)
  • Bits aléatoires (Random Bits): Tous les autres 122 bits DOIVENT être obtenus à partir d'une source aléatoire cryptographiquement sécurisée ou d'un générateur de nombres pseudo-aléatoires de haute qualité

Exemple d'implémentation (pseudo-code):

uuid[6] = (uuid[6] & 0x0F) | 0x40;  // Définir la version à 4 (0100xxxx)
uuid[8] = (uuid[8] & 0x3F) | 0x80; // Définir le variant à 10xxxxxx

4.5. Node IDs that Do Not Identify the Host (ID de nœud qui n'identifient pas l'hôte)

Cette section décrit les alternatives pour générer des ID de nœud qui n'identifient pas l'hôte:

  1. Random Node ID (ID de nœud aléatoire): Définir le bit le moins significatif du premier octet de l'ID de nœud à un (bit multicast). Cela marque l'UUID comme n'étant pas basé sur une adresse MAC réelle.

  2. Persistent Random Node ID (ID de nœud aléatoire persistant): Générer un ID de nœud aléatoire une fois et le stocker pour réutilisation. Cela fournit une cohérence entre les redémarrages tout en maintenant la confidentialité.


Note: Pour des exemples d'implémentation détaillés et des algorithmes complets, veuillez consulter la spécification officielle RFC 4122 et l'Annexe A.