Aller au contenu principal

5.1. UUID Version 1

5.1. UUID Version 1

UUIDv1 est un UUID basé sur le temps comportant un horodatage de 60 bits représenté par le temps universel coordonné (Coordinated Universal Time, UTC) sous forme de comptage d'intervalles de 100 nanosecondes depuis le 15 octobre 1582 à 00:00:00.00 (la date de la réforme grégorienne du calendrier chrétien).

UUIDv1 comporte également un champ de séquence d'horloge utilisé pour aider à éviter les doublons qui pourraient survenir lorsque l'horloge est réglée en arrière dans le temps ou si l'identifiant de nœud change.

Le champ de nœud se compose d'une adresse MAC IEEE 802, généralement l'adresse de l'hôte ou une valeur dérivée de manière aléatoire selon les sections 6.9 et 6.10.

 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 | ver | time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 6 : Disposition des champs et des bits UUIDv1

Définitions des champs :

time_low : Les 32 bits les moins significatifs de l'horodatage de départ de 60 bits. Occupe les bits 0 à 31 (octets 0-3).

time_mid : Les 16 bits du milieu de l'horodatage de départ de 60 bits. Occupe les bits 32 à 47 (octets 4-5).

ver : Le champ de version de 4 bits tel que défini par la section 4.2, défini sur 0b0001 (1). Occupe les bits 48 à 51 de l'octet 6.

time_high : Les 12 bits les moins significatifs de l'horodatage de départ de 60 bits. Occupe les bits 52 à 63 (octets 6-7).

var : Le champ de variante de 2 bits tel que défini par la section 4.1, défini sur 0b10. Occupe les bits 64 et 65 de l'octet 8.

clock_seq : Les 14 bits contenant la séquence d'horloge. Occupe les bits 66 à 79 (octets 8-9).

node : Identificateur unique spatialement de 48 bits. Occupe les bits 80 à 127 (octets 10-15).

Pour les systèmes qui n'ont pas d'UTC disponible mais disposent de l'heure locale, ils peuvent utiliser celle-ci à la place de l'UTC tant qu'ils le font de manière cohérente dans tout le système. Cependant, cela n'est pas recommandé car la génération de l'UTC à partir de l'heure locale ne nécessite qu'un décalage de fuseau horaire.

Si l'horloge est réglée en arrière, ou si elle aurait pu l'être (par exemple, pendant que le système était éteint), et que le générateur d'UUID ne peut pas être sûr qu'aucun UUID n'a été généré avec des horodatages supérieurs à la valeur à laquelle l'horloge a été réglée, alors la séquence d'horloge DOIT (MUST) être modifiée. Si la valeur précédente de la séquence d'horloge est connue, elle PEUT (MAY) être incrémentée ; sinon, elle DEVRAIT (SHOULD) être définie sur une valeur aléatoire ou pseudo-aléatoire de haute qualité.

De même, si l'identifiant de nœud change (par exemple, parce qu'une carte réseau a été déplacée entre des machines), définir la séquence d'horloge sur un nombre aléatoire minimise la probabilité d'un doublon en raison de légères différences dans les réglages d'horloge des machines. Si la valeur de la séquence d'horloge associée à l'identifiant de nœud modifié était connue, alors la séquence d'horloge PEUT (MAY) être incrémentée, mais cela est peu probable.

La séquence d'horloge DOIT (MUST) ê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. Cela offre une protection maximale contre les identifiants de nœud qui peuvent se déplacer ou basculer d'un système à l'autre rapidement.