Qu'est-ce qu'un UUID ?
Un UUID (Universally Unique IDentifier) est un identifiant de 128 bits (16 octets, 32 caractères hexadécimaux) conçu pour être globalement unique sans avoir besoin d'une autorité centrale. Standardisé par la RFC 4122 (et son successeur RFC 9562, mai 2024).
Format : xxxxxxxx-xxxx-Vxxx-Nxxx-xxxxxxxxxxxx où V est la version et N le variant.
Les 5 versions d'UUID
| Version | Construction | Usage |
|---|---|---|
| v1 | Timestamp + MAC | Historique, peu utilisé (fuite MAC) |
| v3 | Hash MD5 d'un namespace + nom | Déterministe, namespace |
| v4 | 122 bits aléatoires | Le plus courant aujourd'hui |
| v5 | Hash SHA-1 d'un namespace + nom | Déterministe, namespace |
| v7 | Timestamp Unix ms + aléa | Triables chronologiquement, clés primaires DB |
Probabilité de collision
Avec 122 bits aléatoires, il existe 2¹²² ≈ 5,3 × 10³⁶ UUID v4 possibles. Pour avoir 50 % de chance d'observer une collision, il faut générer ~2,7 milliards d'UUID par seconde pendant 1 an (paradoxe des anniversaires). En pratique, on considère qu'une collision est impossible pour tous les usages courants.
Cas d'usage
- Clés primaires de base de données — éviter la séquentialité prédictible, faciliter la fusion de bases (préférer v7 si tri).
- Tokens de session et API keys — aléa cryptographique acceptable.
- Identifiants de fichiers, transactions, événements.
- Idempotency keys pour les API REST.
- Tracing distribué (OpenTelemetry, X-Request-Id).
Génération dans les principaux langages
// JavaScript (navigateur + Node ≥ 14.17)
crypto.randomUUID()
// Python
import uuid
str(uuid.uuid4())
// Java
java.util.UUID.randomUUID().toString()
// Go
import "github.com/google/uuid"
uuid.New().String()
// PostgreSQL
SELECT gen_random_uuid(); -- (pgcrypto)
// Bash
uuidgenUUID v7 : la nouvelle référence
Standardisée en mai 2024 (RFC 9562), la v7 place le timestamp Unix en millisecondes au début du UUID, suivi de 74 bits d'aléa. Les UUID générés successivement sont donc triables par date. Avantages massifs pour les bases de données (indexation B-tree efficace, pagination par cursor) tout en conservant l'unicité de la v4. Adopter v7 pour les nouveaux projets dès que possible.
Pièges courants
- Utiliser
Math.random()au lieu decrypto.randomUUID()→ non-cryptographique, prédictible. - Stocker un UUID en VARCHAR(36) plutôt qu'en BINARY(16) ou UUID natif → 2× plus de place, index 2× plus lents.
- Utiliser v4 comme clé primaire pour de très grandes tables → fragmentation B-tree, performance dégradée. Préférer v7.
- Croire que l'UUID est « secret » : 122 bits d'aléa = sécurité cryptographique, mais l'UUID lui-même apparaît dans les logs, URLs.
Questions fréquentes
UUID v4 ?
122 bits d'aléa, version la plus utilisée.
Sûr crypto ?
Oui via crypto.randomUUID() — basé sur CSPRNG OS.
Collision possible ?
Théoriquement, négligeable en pratique (1 sur 10³⁶).
UUID v7 ?
Nouveau standard 2024, timestamp + aléa, triable.
Stocker en DB ?
BINARY(16) ou UUID natif, pas VARCHAR(36).
Outils complémentaires
Sources
- RFC 9562 — UUIDs (mai 2024, remplace RFC 4122)
- MDN — Crypto.randomUUID() (developer.mozilla.org)