Universally unique identifier

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Universal Unique Identifier)

Universally unique identifier (UUID), de l'anglais signifiant littéralement « identifiant unique universel », est en informatique un système permettant à des systèmes distribués d'identifier de façon unique une information sans coordination centrale importante. Dans ce contexte, le mot « unique » doit être pris au sens de « unicité très probable » plutôt que « garantie d'unicité ». Il s'agit d'une spécification DCE définie initialement par l'OSF (Open Software Foundation).

Cette spécification a été enrichie par la RFC 4122[1], en 2005, qui standardise des algorithmes de génération n'utilisant pas d'adresse matérielle. L'UUID est normalisé par l'ISO/IEC 9834-8:2008 qui prend en compte les algorithmes OSF, RFC 4122[1], mais aussi certains nommages « propriétaires ».

Ces identifiants uniques sont codés sur 128 bits et peuvent être produits en utilisant des composantes pseudo-aléatoires ainsi que les caractéristiques d'un ordinateur (numéro de disque dur, adresse MAC, etc.).

Un UUID est initialement conçu de manière à être unique dans le monde ; cependant, les algorithmes de hachage et les générateurs pseudo-aléatoires introduisent un risque non nul que deux ordinateurs produisent un même identifiant. La norme ISO définit d'ailleurs des « identificateurs de 128 bits qui sont soit garantis mondialement uniques ou sont mondialement uniques avec une forte probabilité ». Quant à la RFC 4122[1], si elle parle d'identificateur unique, elle précise que les identificateurs issus d'espaces de noms différents sont seulement « différents avec une forte probabilité » (§4.3).

Les UUID sont destinés à l'identification de composants logiciels (plugins), des différents membres dans un système distribué ou d'autres applications nécessitant une identification sans ambiguïté. Les UUID peuvent être générés sur les systèmes Unix via la commande uuidgen. Sous debian, le paquet e2fsprogs contient une commande /sbin/blkid qui permet d'afficher un UUID correspondant à certains périphériques (paquet util-linux sous RedHat/CentOS).

Format[modifier | modifier le code]

Dans sa représentation textuelle canonique, les 16 octets d'un UUID sont représentés comme 32 chiffres hexadécimaux en minuscules séparés par 4 tirets sous la forme suivante: 123e4567-e89b-12d3-a456-426614174000 ........-....-M...-N...-............

Les 4 bits de M et les bits de 1 à 3 de N déterminent le format de l'UUID.

M représente la version utilisée par l'UUID alors que N représente la variante, dans l'exemple M vaut 1 et N vaut 10.., indiquant un UUID version-1 variant-1, c'est-à-dire un UUID basé sur la date DCE/RFC 4122.

La RFC 4122 Section 3 stipule que les caractères sont affichés en minuscules même si les majuscules sont permises lors d'une saisie.

Les GUIDs de Microsoft sont parfois représentés avec des accolades : {123e4567-e89b-12d3-a456-426652340000}

RFC 4122 définit une Uniform Resource Name (URN) namespace pour les UUIDs. Un UUID représenté comme un URN s'affiche sous la forme suivante: urn:uuid:123e4567-e89b-12d3-a456-426655440000

Algorithmes de génération[modifier | modifier le code]

L'algorithme de génération diffère selon la version. La première version du standard prévoyait de générer l'identifiant avec l'adresse MAC de l'ordinateur et un temps écoulé (en dixièmes de microseconde) depuis une date de référence. L'UUID produite est unique, sous réserve qu'une même adresse MAC ne soit pas utilisée pour plusieurs cartes réseaux et qu'il n'y ait pas deux identifiants produits en moins de 0,1μs.

Cependant, l'utilisation de l'adresse MAC a un effet pervers : donner des informations sur l'ordinateur qui a généré l'identifiant. Des améliorations ont été entreprises et standardisées par la RFC 4122[1] (puis normalisées ISO). On peut maintenant faire appel à des nombres pseudo-aléatoires (version 4) et à des fonctions de hachage cryptographiques comme MD5 (version 3) ou SHA-1 (version 5) qui permettent de « casser » toute information relative à l'ordinateur qui a produit l'UUID. Le langage Java 5.0 utilise une variante de la génération de type Leach-Salz dont la spécification a expiré. Toutes ces techniques introduisent cependant une incertitude sur l'unicité de l'identifiant (une séquence pseudo-aléatoire peut sortir deux fois le même résultat, et les algorithmes de hachage ne sont pas bijectifs), la probabilité d'unicité dépend alors de la robustesse de l'algorithme.

Enfin la multiplication de techniques concurrentes non standardisées a fragilisé la robustesse de l'UUID dans ses différentes utilisations (c'est ce qui a motivé la rédaction de la RFC en plus du standard OSF).

Versions[modifier | modifier le code]

Version 1[modifier | modifier le code]

La version 1 crée un UUID en se basant sur l'adresse MAC et l'horodatage. Il garantit la génération d'un identifiant unique (pour deux systèmes avec des adresses MAC différentes et agissant à plus de 0,1μs d'écart). Il permet également sur la même machine, de générer jusqu'à 10 millions d'UUID uniques par seconde.

L'adresse MAC est codée sur 48 bits. L'horodatage est codé sur 74 bits, avec un "timestamp" de 60 bits, correspondant au nombre de dixièmes de micro-secondes écoulées depuis le 15 Octobre 1582 à minuit (UTC), considérée comme le début du calendrier grégorien, suivi d'un "clockmark" de 14 bits. Certaines versions de l'algorithme de génération assurent l'unicité de plusieurs identifiants produits en parallèle par les valeurs données aux derniers bits du "clockmark".

Version 2[modifier | modifier le code]

D'après la RFC 4122[1] la version 2 est une variante DCE (« Distributed Computing Environment ») qui inclut des UIDs POSIX.

Version 3[modifier | modifier le code]

La version 3 est un hash md5 d'un nom (comme une URL ou un OID). L'UUID généré sera toujours égal pour un même nom, il ne contient donc aucun aspect temporal ou aléatoire.

Version 4[modifier | modifier le code]

La version 4 génère un UUID totalement aléatoire.

Version 5[modifier | modifier le code]

La version 5 est un hash sha1 d'un nom (comme une URL ou un OID). Comme pour la version 3, l'UUID généré sera toujours égal pour un même nom.

Voir aussi[modifier | modifier le code]

Liens externes[modifier | modifier le code]

Références[modifier | modifier le code]