Qu'est-ce qu'un UUID/GUID ?
UUID (Universally Unique Identifier) et GUID (Globally Unique Identifier) sont des termes interchangeables pour des identifiants uniques de 128 bits. Créés pour générer des IDs uniques sans nécessiter de coordination centrale, ils sont largement utilisés dans les bases de données, APIs REST et systèmes distribués.
Versions UUID
UUID v4 - Aléatoire (Recommandé)
Généré aléatoirement à l'aide d'une cryptographie forte. Probabilité de collision : ~1 sur 2¹²² (des billions de billions). Idéal pour la plupart des cas : clés primaires, tokens de session, identifiants de ressources.
Exemple : 550e8400-e29b-41d4-a716-446655440000
UUID v1 - Basé sur Timestamp
Inclut timestamp (60 bits) + adresse MAC de l'ordinateur (48 bits) + compteur. Avantage : triable chronologiquement. Inconvénient : révèle des informations système (adresse MAC, heure de création).
Exemple : 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Autres Versions (v3, v5, v6, v7)
v3/v5 : Générés par hachage (MD5/SHA-1) d'un namespace + nom. Déterministes (même entrée = même UUID). v6/v7 : Propositions récentes combinant timestamp triable avec aléa sécurisé.
Exemple :
Cas d'utilisation courants
🗄️ Clés Primaires de Base de Données
Remplacez auto-increment par des UUIDs pour faciliter la fusion de données entre environnements (dev, staging, prod) et le sharding horizontal. MongoDB, PostgreSQL et MySQL le supportent nativement.
🔗 URLs de Ressources REST
/api/users/550e8400-e29b-41d4-a716-446655440000
Les UUIDs dans les URLs empêchent les attaques par énumération et maintiennent les URLs imprévisibles.
🎫 Tokens de Session et Authentification
Tokens OAuth, session IDs, reset tokens. Les UUIDs sont cryptographiquement sécurisés et impossibles à deviner (contrairement aux séquences numériques).
📦 Identifiants d'Événements/Messages
Traçage d'événements dans les microservices, files de messages (RabbitMQ, Kafka), logs distribués. Correlation IDs entre services.
📁 Noms de Fichiers Uniques
Téléchargements d'images, sauvegardes, fichiers temporaires. Évite les conflits et permet les téléchargements simultanés sans verrouillage.
UUID vs Auto-increment : Avantages et Inconvénients
| Caractéristique | UUID | Auto-increment (INT) |
|---|---|---|
| Taille | 16 octets (128 bits) | 4 octets (32 bits) ou 8 octets (64 bits) |
| Génération distribuée | ✓ Oui, sans coordination | ✗ Nécessite un contrôle central |
| Prévisibilité | Imprévisible (sécurisé) | Prévisible (risque d'énumération) |
| Performance d'index | Plus lent (128 bits aléatoires) | Plus rapide (séquentiel, cache-friendly) |
| Ordre chronologique | Non (v4), Oui (v1, v6, v7) | Oui (séquentiel) |
| Fusion de bases | ✓ Trivial (sans collision) | ✗ Complexe (conflits d'ID) |
| Idéal pour | Systèmes distribués, APIs, sécurité | Systèmes monolithiques, performance critique |
Comment utiliser UUID dans différents langages
JavaScript/Node.js
// Natif (Node.js 14.17+)
import { randomUUID } from 'crypto';
const uuid = randomUUID();
// Avec bibliothèque 'uuid'
import { v4 as uuidv4 } from 'uuid';
const uuid = uuidv4();Python
import uuid # UUID v4 uuid_v4 = uuid.uuid4() print(uuid_v4) # 550e8400-e29b-41d4-a716-446655440000 # UUID v1 uuid_v1 = uuid.uuid1() print(uuid_v1) # 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Java
import java.util.UUID; // UUID aléatoire UUID uuid = UUID.randomUUID(); System.out.println(uuid.toString());
PostgreSQL
-- Activer l'extension CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Générer UUID SELECT uuid_generate_v4(); -- Créer table avec UUID CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(100) );
FAQ - Questions Fréquentes
1. Les UUIDs sont-ils vraiment uniques ? Peut-il y avoir des collisions ?
Les UUIDs v4 ont 2¹²² combinaisons possibles. La probabilité de collision est astronomiquement faible (1 sur 5 milliards après avoir généré 1 milliard d'UUIDs). À des fins pratiques, considérez-les comme uniques. Les bases de données modernes détectent les collisions via des contraintes UNIQUE.
2. UUID v1 est-il sécurisé ? Puis-je l'utiliser en production ?
UUID v1 révèle le timestamp de création et l'adresse MAC de la machine, considéré comme une fuite d'informations. N'utilisez pas pour les tokens de sécurité ou dans des contextes où la confidentialité est critique. Préférez v4 pour la sécurité, ou v6/v7 si vous avez besoin d'un ordre chronologique sans exposer l'adresse MAC.
3. UUID impacte-t-il les performances de la base de données ?
Oui, mais généralement acceptable. Les UUIDs aléatoires causent une fragmentation de l'index B-tree (non séquentiels). Pour PostgreSQL, utilisez UUID v7 ou ULID (Universally Unique Lexicographically Sortable Identifier). Pour des cas extrêmes de performance (milliards d'enregistrements), conservez auto-increment.
4. Dois-je utiliser des tirets ou les supprimer ?
Dépend du contexte. Avec tirets (norme RFC 4122) : plus lisible, compatible avec les bibliothèques standard. Sans tirets : économise 4 octets en stockage de chaîne, utile pour URLs courtes ou tokens. PostgreSQL stocke en binaire (16 octets) indépendamment du formatage.
5. Puis-je utiliser UUID comme raccourcisseur d'URL ?
Techniquement oui, mais inefficace. Les UUIDs ont 36 caractères (avec tirets) ou 32 sans. Pour les raccourcisseurs d'URL, utilisez des encodages plus courts : base62 (A-Za-z0-9) génère des IDs de 6-8 caractères, suffisants pour des milliards d'URLs.
6. UUID fonctionne-t-il dans les systèmes hors ligne ?
Oui ! C'est l'un des principaux avantages. Les clients hors ligne (apps mobiles, IoT) génèrent des UUIDs localement sans connexion au serveur. Lors de la synchronisation, il n'y a pas de conflits d'ID. Idéal pour les CRDTs et la synchronisation multi-appareils.