Génération d’identifiants UUID v4
Le générateur UUID v4 de cet outil produit des identifiants uniques fondés sur 122 bits de hasard pur pour chaque valeur. Les 6 bits restants sont fixés par la version (4) et la variante (RFC 4122), ce qui donne des chaînes de 36 caractères hexadécimaux dans le format canonique 8‑4‑4‑4‑12. Contrairement aux identifiants horodatés (UUID v7, ULID), les UUID v4 ne portent aucune information temporelle et se trient de façon arbitraire. Cette propriété a des conséquences directes sur la fragmentation des index B‑tree dans les bases de données relationnelles, un point souvent négligé par les développeurs.
L’utilisateur contrôle le nombre d’identifiants (de 1 à 100), l’utilisation des lettres majuscules (A‑F au lieu de a‑f) et la présence des tirets (format complet 36 car. ou compact 32 car.). Toute modification des options régénère immédiatement la liste dans le navigateur, sans appel serveur. Les identifiants peuvent être copiés un par un en cliquant sur une ligne, ou tous en une seule action.
Pourquoi ce générateur UUID v4 se distingue
La plupart des générateurs en ligne se contentent d’appliquer Math.random() ou un algorithme pseudo‑aléatoire. Ici, chaque UUID puise 122 bits d’entropie directement dans l’API crypto.randomUUID() du navigateur, qui utilise le générateur cryptographique du système d’exploitation. Cela garantit une imprévisibilité maximale, importante pour les jetons d’API, les identifiants de session ou les clés de distribution sans coordination centrale.
La différence fondamentale avec les autres formats d’identifiants du même outil (UUID v7, ULID, NanoID) réside dans les options de formatage propres aux UUID. Les bascules majuscules et tirets n’apparaissent que lorsque le type UUID est sélectionné dans le menu déroulant. Pour le UUID v4, ces réglages ont un sens concret: l’absence de tirets produit une chaîne de 32 caractères hexadécimaux, utile dans les URL ou les contextes où la lisibilité humaine prime moins. L’activation des majuscules peut faciliter la reconnaissance des différences sur certains écrans ou conventions de codage.
Un autre trait distinctif: les UUID v4 se trient arbitrairement. Contrairement à un UUID v7 dont les premiers bits encodent un horodatage (permettant un tri chronologique), le v4 n’offre aucune garantie d’ordre. Cela n’est pas un défaut, mais une caractéristique à connaître lorsqu’on l’utilise comme clé primaire dans une base de données. Les index B‑tree subissent une fragmentation importante à cause de l’insertion aléatoire, ce qui dégrade les performances en écriture sur les gros volumes de données.
Structure technique de l’UUID v4
L’UUID v4 suit la RFC 4122, section 4.4. Sur les 128 bits de la chaîne finale, seuls 122 sont aléatoires. Les 6 bits fixes sont répartis ainsi:
- 4 bits pour la version (position 13 du format canonique, soit le premier caractère du troisième groupe) → valeur
4en hexadécimal. - 2 bits pour la variante (position 17 du format canonique, premier caractère du quatrième groupe) → les bits
10en binaire, ce qui donne un des quatre résultats suivants:8,9,A,B(oua,bselon la casse).
La représentation canonique est xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx où x est un chiffre hexadécimal aléatoire et y vaut 8, 9, A ou B (en majuscules ou minuscules). Par exemple : f47ac10b-58cc-4372-a567-0e02b2c3d479.
Si l’option Inclure les tirets est désactivée, cette chaîne devient f47ac10b58cc4372a5670e02b2c3d479, soit 32 hexadécimaux. Il n’y a plus de distinction visuelle entre les groupes, mais la valeur reste valide et peut être transformée en format canonique par insertion des tirets aux positions 8, 13, 18 et 23.
Le basculement entre minuscules et majuscules n’affecte que les lettres hexadécimales a‑f / A‑F. Les chiffres 0‑9 et la valeur fixe de la version (4 pour v4) restent inchangés. Les deux formes sont équivalentes pour la plupart des systèmes, mais certains outils ou fichiers de configuration exigent une casse précise.
Probabilité de collision et entropie
Avec 122 bits d’entropie, la probabilité de générer deux UUID v4 identiques est extrêmement faible. Le calcul pratique repose sur l’approximation du paradoxe des anniversaires. Pour une collection de n UUID v4, la probabilité d’au moins une collision est d’environ 1 - e^(-n² / (2 × 2¹²²)).
| Nombre d’UUID | Probabilité d’une collision |
|---|---|
| 1 | 0 |
| 1 000 | ~5,4 × 10⁻³¹ |
| 1 million | ~5,4 × 10⁻²² |
| 1 milliard | ~5,4 × 10⁻¹³ |
| 10¹⁴ | ~0,005 (0,5 %) |
Même à une échelle de 10¹⁴ identifiants (cent mille milliards), la chance de collision reste inférieure à 1 %. En pratique, pour toute application réaliste, le risque est négligeable. Cela tient à la taille de l’espace de 2¹²² possibilités, soit environ 5,3 × 10³⁶ valeurs distinctes.
Cette propriété rend l’UUID v4 adapté aux systèmes où l’on ne peut pas garantir l’unicité par une autorité centrale: génération hors ligne dans des appareils embarqués, identifiants de transactions réparties, ou jetons d’authentification qui ne doivent pas pouvoir être devinés par itération. La forte entropie empêche aussi l’énumération: contrairement à un identifiant entier auto‑incrémenté, un attaquant ne peut pas déduire le prochain UUID valide.
Impact sur l’indexation des bases de données
Le tri arbitraire des UUID v4 a des conséquences mesurables sur les performances des index B‑tree, l’index structurel le plus courant dans les bases de données relationnelles (PostgreSQL, MySQL, Oracle). Lorsque des enregistrements sont insérés avec des clés primaires UUID v4, les nouvelles lignes s’insèrent à des positions aléatoires dans l’arbre, ce qui provoque:
- Fragmentation des pages d’index: l’arbre doit être rééquilibré fréquemment, car les nouvelles entrées ne s’ajoutent pas en fin d’index.
- Augmentation des écritures: chaque insertion peut nécessiter l’éclatement de plusieurs pages.
- Diminution de la densité de l’index: les pages restent partiellement remplies, augmentant la taille physique de l’index.
- Dégradation du cache: la localité temporelle disparaît, ce qui réduit l’efficacité du cache mémoire.
Les tests sur PostgreSQL montrent qu’un index clusterisé sur une clé UUID v4 peut être 3 à 5 fois plus lent en écriture qu’un index sur une clé séquentielle (bigint auto‑incrémenté). Pour les tables de très grande taille (plusieurs centaines de millions de lignes), la différence peut atteindre un ordre de grandeur.
Comparaison avec d’autres formats:
| Format | Ordre de tri | Fragmentation B‑tree | Horodatage intégré |
|---|---|---|---|
| UUID v4 | Aléatoire | Élevée | Non |
| UUID v7 | Chronologique | Faible | Oui |
| ULID | Chronologique | Faible | Oui (milliseconde) |
| Séquence (bigint) | Croissant | Très faible | Non |
Cela ne rend pas l’UUID v4 inutilisable. Dans les systèmes distribués où l’unicité sans coordination est cruciale, l’impact sur l’indexation est un compromis acceptable. Certaines bases de données offrent des solutions, comme les index non‑clustered ou l’utilisation d’UUID v7 pour l’ordre chronologique tout en conservant le caractère aléatoire. L’important est d’être conscient du comportement avant de choisir UUID v4 comme clé primaire.
Cas d’usage et personnalisation du format
Les UUID v4 conviennent à plusieurs situations où la prédictibilité doit être évitée et où la génération centralisée est impossible:
- Identifiants de session ou jetons d’API: l’imprévisibilité protège contre les attaques par détournement de session.
- Objets dans des systèmes hors ligne: applications mobiles ou IoT qui génèrent des clés localement avant sync.
- Bases de données multi‑masters: plusieurs instances indépendantes créent des enregistrements sans conflit.
- Masquage du volume de données: contrairement aux entiers séquentiels, un UUID ne révèle pas le nombre d’enregistrements ni leur ordre d’insertion.
- Tests et simulations: peupler une base de test avec des identifiants réalistes sans se soucier des doublons.
Les options de personnalisation offertes par la page répondent à des contraintes concrètes:
- Tirets absents: utile pour les URL (pas d’encodage nécessaire), les noms de fichiers, ou les clés dans un système qui stocke les identifiants sous forme de chaîne compacte.
- Majuscules: certains systèmes (ex. bases de données sensibles à la casse) imposent une convention; d’autres préfèrent les minuscules pour la lisibilité. La bascule permet de s’adapter sans retravailler les chaînes manuellement.
Exemple concret: une API REST génère des identifiants d’objet sous la forme /api/documents/3f1c2b8a9d0e4f5c. Sans tirets et en minuscules, cette URL reste propre et compacte. En revanche, pour une interface utilisateur où les identifiants sont affichés dans des tableaux, le format canonique avec tirets (3f1c2b8a-9d0e-4f5c-...) facilite la lecture et la vérification visuelle.
Génération locale et avantages pour la vie privée
Tout le traitement s’effectue dans le navigateur de l’utilisateur. La page utilise l’API crypto.randomUUID() (ou, dans les navigateurs qui ne la supportent pas, une implémentation équivalente basée sur crypto.getRandomValues()). Aucune donnée n’est transmise à un serveur, ce qui présente plusieurs avantages:
- Latence nulle: les identifiants sont affichés instantanément après chaque modification, même pour 100 UUID.
- Vie privée: l’outil n’enregistre pas les identifiants générés, ni leur nombre, ni les réglages choisis.
- Fonctionnement hors connexion: une fois la page chargée, l’utilisateur peut couper Internet et continuer à générer des UUID.
- Sécurité renforcée: pour les jetons sensibles, la génération locale évite toute interception par un serveur tiers.
Cette approche est conforme aux bonnes pratiques de sécurité: l’entropie provient du générateur cryptographique du système d’exploitation (via crypto), identique à celui utilisé pour les clés TLS ou les nonces de chiffrement. Les résultats ne sont donc pas moins sûrs que ceux d’une bibliothèque serveur comme uuid en Python ou Node.js.
Foire aux questions (FAQ)
Q: Quelle est la différence entre UUID v4 et UUID v7? R: L’UUID v7 intègre un horodatage dans ses premiers bits, ce qui le rend triable chronologiquement et réduit la fragmentation des index B‑tree. L’UUID v4 ne contient que des bits aléatoires et se trie arbitrairement. Le v7 est recommandé pour les nouvelles bases de données où l’ordre est utile; le v4 reste pertinent pour les cas où l’imprévisibilité est primordiale.
Q: Peut-on générer plus de 100 UUID d’un coup? R: Non, la page limite le nombre à 100 inclusivement. Pour un plus grand volume, il est préférable d’utiliser un script local ou une bibliothèque dédiée.
Q: Les UUID générés sont-ils uniques au monde? R: Il n’existe pas de garantie absolue, mais la probabilité de collision est si faible (voir tableau plus haut) qu’elle est considérée comme négligeable pour toute application pratique.
Q: Pourquoi les lettres hexadécimales sont-elles tantôt minuscules, tantôt majuscules? R: La bascule Uppercase contrôle cela. Par défaut, les lettres sont en minuscules. En activant l’option, elles passent en majuscules. Cela n’affecte pas la validité ni l’unicité de l’identifiant, seulement son affichage.
Q: L’option « Inclure les tirets » change‑t‑elle la valeur de l’UUID? R: Non. Les tirets sont purement visuels et suivent la convention de la RFC 4122. En les supprimant, la chaîne devient plus courte (32 caractères), mais le contenu hexadécimal reste identique. On peut toujours reconstituer la forme canonique en insérant les tirets aux bonnes positions.
Q: Quand choisir UUID v4 plutôt que ULID ou NanoID? R: Utilisez UUID v4 si vous avez besoin d’un standard largement reconnu, d’une taille fixe de 128 bits, ou d’une compatibilité avec des systèmes existants qui attendent ce format. ULID offre un ordre temporel et une représentation plus compacte (26 caractères en base32). NanoID est plus court (21 caractères par défaut) mais moins standardisé.