
Un Identifiant universellement unique (UUID) est une étiquette de 128 bits utilisée dans les systèmes informatiques pour identifier les informations de manière unique. Les UUID sont conçus pour être uniques dans l'espace et dans le temps, ce qui leur permet d'être générés indépendamment sans autorité centrale, minimisant ainsi le risque de duplication.
Les UUID servent à diverses fins, notamment :
- Identification des enregistrements dans les bases de données.
- Marquage des objets dans les systèmes distribués.
- Servir de clés primaires dans les applications où l'unicité est essentielle.
Cas d'utilisation réels
-
Bases de données : l'UUID est utilisé comme clé primaire dans les bases de données relationnelles pour garantir l'identification unique des enregistrements.
-
Microservices : facilitez la communication entre les services en fournissant des identifiants uniques pour les demandes et les ressources.
-
Appareils IoT : identifiez les appareils de manière unique dans un réseau, garantissant ainsi que les données provenant de plusieurs sources peuvent être regroupées sans conflits.
Avantages et inconvénients de l'utilisation de l'UUID
Avantages :
-
Unicité globale : il est extrêmement peu probable que les UUID entrent en collision, ce qui les rend adaptés aux systèmes distribués dans lesquels plusieurs nœuds génèrent des identifiants de manière indépendante.
-
Aucune autorité centrale requise : ils peuvent être générés sans coordination, ce qui simplifie les opérations dans les environnements distribués.
-
Évolutivité : ils fonctionnent bien dans les systèmes qui nécessitent une mise à l'échelle sur plusieurs serveurs ou services.
Inconvénients :
-
Taille de stockage : les UUID consomment plus d'espace (128 bits) par rapport aux identifiants entiers traditionnels (généralement 32 bits), ce qui peut entraîner une augmentation des coûts de stockage.
-
Problèmes de performances : l'indexation des UUID peut dégrader les performances de la base de données en raison de leur caractère aléatoire et de leur taille, ce qui entraîne des temps de requête plus lents par rapport aux ID séquentiels.
-
Manque de convivialité : les UUID ne sont pas facilement mémorisables ni conviviaux lorsqu'ils sont présentés dans les interfaces utilisateur.
La norme
La représentation standard d'un UUID se compose de 32 caractères hexadécimaux répartis en cinq groupes, séparés par des traits d'union, suivant le format 8-4-4-4-12, soit un total de 36 caractères (32 caractères alphanumériques plus 4 traits d'union). .
Le format UUID peut être visualisé comme suit :
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Où:
-
M indique la version de l'UUID.
-
N indique la variante, ce qui permet d'interpréter la disposition de l'UUID.
Composants d'un UUID
-
TimeLow : 4 octets (8 caractères hexadécimaux) représentant le champ bas de l'horodatage.
-
TimeMid : 2 octets (4 caractères hexadécimaux) représentant le champ central de l'horodatage.
-
TimeHighAndVersion : 2 octets (4 caractères hexadécimaux) qui incluent le numéro de version et le champ haut de l'horodatage.
-
ClockSequence : 2 octets (4 caractères hexadécimaux) utilisés pour éviter les collisions, en particulier lorsque plusieurs UUID sont générés en succession rapide ou si l'horloge système est ajustée.
-
Nœud : 6 octets (12 caractères hexadécimaux), représentant généralement l'adresse MAC du nœud générateur.
Types d'UUID
Version 1 : UUID basés sur le temps qui utilisent une combinaison de l'horodatage actuel et de l'adresse MAC du nœud générateur. Cette version garantit l'unicité dans l'espace et le temps.
Version 2 : similaire à la version 1 mais inclut les identifiants de domaine local ; cependant, il est moins couramment utilisé en raison de ses limites.
Version 3 : UUID basés sur le nom générés à l'aide d'un hachage MD5 d'un identifiant d'espace de noms et d'un nom.
Version 4 : UUID générés de manière aléatoire qui offrent un caractère aléatoire et unique élevé, avec seulement quelques bits réservés au contrôle de version.
Version 5 : comme la version 3 mais utilise SHA-1 pour le hachage, ce qui la rend plus sécurisée que la version 3.
Variantes
Le champ variante dans un UUID détermine sa disposition et son interprétation. Les variantes les plus courantes incluent :
-
Variante 0 : réservé à la rétrocompatibilité NCS.
-
Variante 1 : la disposition standard utilisée pour la plupart des UUID.
-
Variante 2 : utilisé pour les UUID de sécurité DCE, qui sont moins courants.
-
Variante 3 : réservé aux définitions futures.
Exemple
Pour la version 4, un UUID pourrait ressembler à ceci :
550e8400-e29b-41d4-a716-446655440000
Ici:
-
41d4 indique qu'il s'agit d'une version 4.
-
a7 représente la variante, dans ce cas, la variante commune "Leach-Salz".
Comment les UUID sont calculés
-
Version 1 (basée sur le temps) :
- L'horodatage correspond généralement au nombre d'intervalles de 100 nanosecondes depuis le 15 octobre 1582 (date de la réforme du calendrier grégorien).
- Le nœud est l'adresse MAC de la machine générant l'UUID.
- La séquence d'horloge permet de garantir l'unicité lorsque l'heure de l'horloge change (par exemple, en raison du redémarrage du système).
-
Version 3 et version 5 (basées sur le nom) :
- Un espace de noms (comme un domaine DNS) est combiné avec un nom (comme un chemin de fichier ou une URL) et haché.
- Le hachage (MD5 pour la version 3, SHA-1 pour la version 5) est ensuite structuré dans un format UUID, garantissant que les champs de version et de variante sont correctement définis.
-
Version 4 (aléatoire) :
- Des nombres aléatoires ou pseudo-aléatoires sont générés pour les 122 bits de l'UUID.
- Les champs de version et de variante sont définis en conséquence, garantissant ainsi la conformité aux normes UUID.
Exemple de calcul UUIDv4
Étape 1 : générer 128 bits aléatoires
Supposons que nous générons la valeur aléatoire de 128 bits suivante :
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
Étape 2 : appliquer la version et la variante de l'UUIDv4
Version : Remplacez les bits 12 à 15 (4ème caractère) par 0100 (pour la version 4 de l'UUID).
Original : 1100 devient 0100 → Valeur mise à jour à cette position.
Variante : remplacez les bits 6 à 7 du 9ème octet par 10 (pour la variante RFC 4122).
Original : 11 devient 10 → Valeur mise à jour à cette position.
Étape 3 : Formater en hexadécimal
Convertissez le binaire 128 bits en 5 groupes hexadécimaux :
- Groupe 32 bits : 11001100110101101101010101111010 → ccda55ba
- Groupe 16 bits : 1011101101101110 → b76e
- Groupe 16 bits : 0100010101000101 → 4545 (avec 0100 pour la version 4)
- Groupe 16 bits : 1010110111110010 → adf2 (avec 10 pour la variante)
- Groupe 48 bits : 11010011011110100100101111001011 → d39d25cb
Étape 4 : Combinez les groupes
L'UUID final ressemblerait à ceci :
ccda55ba-b76e-4545-adf2-d39d25cb