Les UUID (Universally Unique Identifier) constituent une méthode de génération incontournable, assurant l’unicité des identifiants au sein des bases de données. Dans cet article, nous examinerons en détail leurs propriétés et explorerons les raisons pour lesquelles ils sont largement adoptés dans les environnements informatiques, en particulier au sein des systèmes distribués.
Qu’est-ce qu’un UUID ?
Un UUID (Universally Unique IDentifier) est un identifiant composé de 32 caractères hexadécimaux.
Les UUID, au même titre que les identifiants auto-incrémentés, sont utilisés en informatique pour identifier des données de manière unique.
Les UUID sont la plupart du temps utilisés par les Systèmes de Gestion de Base de Données tels que MySQL ou MariaDB.
Structure
Format
Le format standard d’un UUID est constitué de 5 groupes séparés par des tirets :
xxxxxxxx-xxxx-Yxxx-Zxxx-xxxxxxxxxxxx
Si la majorité des caractères (représentés ici par x
) sont imprévisibles, 2 d’entres eux jouent un rôle bien spécifique (représentés par Y
et Z
).
La génération d’un UUID dépend de 2 facteurs principaux :
- Sa version (indiquée par le caractère
Y
) - Sa variante (indiquée par le caractère
Z
)
Voici un exemple d’UUID : 5759456d-0ad2-4a3b-ba06-5bcac4f33481
(ici Y => 4
et Z => b
)
Versions d’UUID
Il existe à ce jour 5 versions d’UUID, définissant le schéma de génération à suivre pour générer les caractères x
.
Version 1
: Basée sur l’horodatage et l’adresse MAC.Version 2
: Basée sur l’horodatage, l’adresse MAC et un identifiant de groupe.Version 3
: Basée sur un hash MD5 d’un espace de noms et d’un nom.Version 4
: Basée sur des nombres aléatoires.Version 5
: Basée sur un hash SHA-1 d’un espace de noms et d’un nom.
Variantes d’UUID
La variante indique quant à elle la structure et l’utilisation du UUID.
Les variantes courantes incluent :
Variante 0
: Réservée pour la compatibilité future.Variante 1
: Suivant la norme RFC 4122.Variante 2
: Réservée pour la compatibilité Microsoft.Variante 3
: Réservée pour la compatibilité future ou des usages spécifiques.
Contrairement à la version, la variante n’apparaît pas en tant que telle dans l’UUID. La variante associée au caractère Z
sur l’intervalle définie dans le tableau de correspondance suivant :
Caractère Hexadécimal | Variante |
---|---|
[0 - 7] | Variante 0 - Réservée pour la compatibilité ascendante NCS (Network Computing System). |
[8 - b] | Variante 1 - RFC 4122/DCE 1.1 UUIDs |
[c - d] | Variante 2 - Réservée, compatibilité ascendante Microsoft Corporation |
[e - f] | Variante 3 - Réservée pour une définition future. |
Pour exemple, l’UUID 5759456d-0ad2-4a3b-ba06-5bcac4f33481
est en :
- Version 4 (indiquée dans «
4
a3b ») - Variante 1 (car «
b
a06 » appartient à l’intervalle[8 - b]
).
En résumé, la version d’un UUID précise comment il est généré (aléatoire, basé sur l’horodatage, etc.), tandis que la variante définit le format général et la compatibilité du UUID.
🤔 Un UUID est-il vraiment unique ?
Les versions 1
et 2
font entrer en jeu l’adresse MAC de l’ordinateur générant l’UUID. Cet identifiant étant propre à chaque ordinateur, il permet, une fois couplé à l’horodatage, de générer un UUID qui ne pourra plus jamais l’être à nouveau. On parle bien d’unicité.
Pour ce qui est des versions 3
, 4
et 5
, la diversité de combinaisons est si vaste que le risque de génération de doublons (on parle de « collision ») est extrêmement improbable.
Un UUID est un identifiant de 128 bits (16 octets), ce qui signifie qu’il y a 2^128
valeurs possibles…
Mais alors, pourquoi parle t-on d’UUID unique, même pour la version 4
, aujourd’hui largement utilisée ? Parceque 2^128
, ca fait : 340 282 366 920 938 463 463 374 607 431 768 211 456
.
Pour comprendre l’énormité de ce nombre, on estime qu’il y a environ 2^60
grains de sable sur toutes les plages de la Terre, ce qui est immensément inférieur au nombre de combinaisons d’UUIDv4 possibles…
La garantie d’unicité des UUID repose sur leur probabilité de collision extrêmement faible, bien que ce ne soit pas une certitude absolue.
Comment générer un UUID ?
Il existe plusieurs façons de générer des UUID, en fonction de vos besoins.
1. Générateurs en ligne
Il existe de nombreux générateurs en ligne qui permettent de générer des UUID de manière simple et rapide. Ces outils sont souvent pratiques pour des besoins ponctuels ou pour des tests.
2. Fonctions natives aux langages
De nombreux langages de programmation (Python, PHP…) intègrent des modules ou fonctions natives pour la génération d’UUID.
3. Bibliothèques tierces
Il existe également des bibliothèques tierces dans la génération et la manipulation d’UUID dans de nombreux langages de programmation. Ces bibliothèques offrent souvent des fonctionnalités avancées et des options de configuration.
4. Commandes système
Certains systèmes d’exploitation offrent des utilitaires en ligne de commande pour générer des UUID :
Pour Linux / MacOS, utilisez uuidgen
:
uuidgen
Pour Windows, utilisez PowerShell :
[guid]::NewGuid()
5. APIs Web
Il existe des services API qui permettent de générer des UUID via des requêtes HTTP.
C’est par exemple le cas de l’API de uuidtools.com :
curl https://www.uuidtools.com/api/generate/v4
Ces différentes méthodes couvrent un large éventail de besoins, allant des solutions simples et rapides aux options plus intégrées et programmatiques.
UUID et systèmes distribués
Bien que cela ne soit pas systématique, l’usage d’UUID est étroitement liée à la mise en place d’architectures de bases de données distribuées.
À l’inverse d’une base de données centralisée, une base de données distribuée (ou décentralisée) est une base de données dont les données sont stockées sur plusieurs nœuds géographiquement dispersés.
Selon les cas d’usage, ces données peuvent être répliquées sur l’ensemble des noeuds ou bien fragmentées.
Une base de données distribuée confère de nombreux atouts :
- Disponibilité
- Tolérance aux pannes
- Évolutivité
- Performances améliorées
- Répartition de la charge
- Résilience
- Faible latence
- Gestion efficace des données massives
- Séparation des préoccupations
- Meilleure résilience face aux catastrophes naturelles
Quand utiliser un UUID ?
Il existe plusieurs types d’identifiants, tels que les identifiants auto-incrémentés, les UUID et d’autres méthodes de génération d’identifiants uniques. Mais alors quand utiliser un UUID ?
Avantages des UUID
Unicité & universalité
Les UUID sont conçus pour être uniques dans le monde entier, ce qui les rend idéaux pour les systèmes distribués où la coordination centralisée est difficile.
En utilisant des UUID, les développeurs peuvent garantir une référence unique à chaque entité, ce qui simplifie la gestion des données et assure l’intégrité des informations, même dans des environnements complexes et évolutifs.
Scalabilité
Contrairement aux identifiants auto-incrémentés, les UUID peuvent être générés localement (dans le code) sans nécessiter de communication avec une base de données centrale
La génération d’UUIDs étant indépendante du contexte, elle contribue à adapter les identifiants à des besoins de scalabilité, en permettant au système de se développer facilement en ajoutant plus de serveurs de bases de données ou d’instances d’applications, sans avoir à synchroniser les identifiants.
Sécurité
Les UUIDv4
, ne se basent pas sur des données réelles telles que l’horodatage ou toute autre information de l’utilisateur. Leur nature aléatoire leur confère une résistance accrue aux attaques de devinette et aux tentatives de détournement.
Les ID séquentiels auto-incrémentés sont prédictibles, ce qui peut permettre à des utilisateurs mal intentionnés d’accéder à des enregistrements spécifiques en manipulant l’URL ou encore de deviner le nombre total d’enregistrements.
Par exemple, si l’URL d’un profil utilisateur est https://example.com/user/{id}
:
- On peut aisément tenter d’accéder à
https://example.com/user/10
,https://example.com/user/1073...
- En revanche, bon courage pour trouver un
UUIDv4
…
Portabilité
Les UUID sont pris en charge par de nombreux langages de programmation, systèmes d’exploitation et bases de données, ce qui facilite leur intégration dans une large gamme d’applications.
Étant indépendants de l’environnement, les UUID peuvent être facilement échangés entre différents systèmes sans risque de conflit.
Inconvénients des UUID
Malgré leurs nombreux avantages, les UUID présentent également quelques inconvénients.
Taille
Un UUID de type UUIDv4
est composé de 16 octets, tandis qu’un ID auto-incrémenté de type INT
ne prend que 4 octets en mémoire.
Cette différence de taille peut entraîner un surcoût en termes de stockage et de bande passante, en particulier dans les bases de données volumineuses ou les systèmes à haute charge.
Lisibilité
En raison de leur format hexadécimal, les UUID sont moins lisibles que les identifiants numériques, ce qui peut rendre le débogage et la maintenance plus difficiles pour les développeurs.
Performance et indexation
Au sein d’une base de données, un index est comme un annuaire téléphonique. Il permet de retrouver rapidement les informations spécifiques, sans avoir à parcourir l’ensemble des données.
- ID auto-incrémentés : Les nouveaux enregistrements s’ajoutent naturellement à la suite des autres de manière séquentielle, créant un index ordonné qui facilite les recherches.
- UUID : Les nouveaux enregistrements se dispersent en raison de la nature aléatoire des UUID, venant perturber l’ordre des index.
Par conséquent, cette fragmentation de l’index engendrée par les UUID signifie que les données sont éparpillées dans différents blocs de stockage, ce qui peut ralentir les opérations de recherche, car la base de données doit parcourir plusieurs endroits physiques pour trouver les données pertinentes.
En conclusion, les UUID offrent une solution fiable et robuste pour garantir l’unicité des identifiants dans les systèmes informatiques, en particulier dans les environnements distribués.