UUID v4 ou v7 : quelle différence ?

Un UUID v4 contient 122 bits purement aléatoires, alors qu'un UUID v7 commence par un horodatage de 48 bits en millisecondes suivi de bits aléatoires : les valeurs v7 se trient donc dans l'ordre de leur création. Utilisez le v7 pour les clés primaires de base de données et tout ce que vous voulez trier par date, et le v4 quand l'identifiant ne doit rien révéler sur sa date de création. Les deux sont des valeurs de 128 bits au même format de 36 caractères, et un GUID est la même chose sous le nom utilisé par Microsoft.

7 min de lecture

La réponse courte

Choisissez l'UUID v7 pour les nouvelles clés de base de données, les identifiants d'événements, les entrées de journal et les noms de fichiers que vous voulez garder dans l'ordre chronologique. Une nouvelle valeur v7 est toujours plus grande que les anciennes : elle s'ajoute donc à la fin de l'index comme le ferait un numéro auto-incrémenté, tout en pouvant être créée sur n'importe quel serveur ou dans le navigateur sans interroger la base.

Choisissez l'UUID v4 pour les jetons, les identifiants publics dont la date de création doit rester privée, et les systèmes qui l'utilisent déjà. Une valeur v4 ne divulgue rien, et pour la plupart des applications qui ne stockent pas des millions de lignes, son ordre aléatoire coûte peu. Les deux versions sont définies dans la RFC 9562, publiée en 2024, qui a remplacé l'ancienne RFC 4122 et ajouté les versions 6, 7 et 8.

Essayez ici : Générateur d'UUID v7

Ouvrir la page complète de l'outil

Comment un UUID est construit

Tout UUID fait 128 bits, écrits sous forme de 32 chiffres hexadécimaux répartis en cinq groupes : 8-4-4-4-12, soit 36 caractères avec les tirets. Deux champs sont fixes dans tout UUID moderne. Le premier chiffre du troisième groupe est la version, lisible d'un coup d'œil : 4 pour aléatoire, 7 pour temps Unix. Le premier chiffre du quatrième groupe est la variante, toujours 8, 9, a ou b pour les UUID standard.

Exemple de v4 : 9b2f4c1e-3a7d-4e8b-a5c2-0f6d1e9a3b47. Exemple de v7 : 019a2b3c-4d5e-7f60-8a1b-2c3d4e5f6a7b. Dans l'exemple v7, les 12 premiers chiffres hexadécimaux (019a2b3c4d5e) sont l'heure de création en millisecondes, c'est pourquoi des identifiants créés à une seconde d'écart partagent presque tout leur début.

PartieUUID v4UUID v7
Taille totale128 bits128 bits
HorodatageAucun48 bits, temps Unix en millisecondes
Version et variante6 bits (version 4)6 bits (version 7)
Bits aléatoires12274 (dont 12 utilisables comme compteur)
Ordre de triAléatoirePar date de création
Révèle la date de créationNonOui, à la milliseconde près
Horodatage valable jusqu'enSans objetEnviron l'an 10889

Pourquoi le v7 est plus rapide comme clé primaire

La plupart des bases de données stockent la clé primaire dans un index B-tree, trié par clé. Avec des clés v4 aléatoires, chaque insertion tombe à un endroit au hasard dans cet arbre. Dès que l'index dépasse la mémoire disponible, les insertions relisent sans cesse d'anciennes pages sur le disque, les pages se divisent à moitié vides et l'index devient plus gros que nécessaire. Avec InnoDB (MySQL et MariaDB), la table elle-même est rangée dans l'ordre de la clé primaire : c'est toute la table qui en souffre, pas seulement l'index.

Avec des clés v7, les nouvelles lignes vont au bord droit de l'index, les pages actives restent en mémoire et les pages se remplissent entièrement. Les tests publiés par les éditeurs de bases de données et par des utilisateurs montrent couramment des insertions nettement plus rapides et des index plus petits qu'avec le v4 sur les grosses tables, même si le gain exact dépend du moteur, de la taille des lignes et du matériel. Les requêtes par plage, comme les 100 dernières commandes, deviennent aussi moins coûteuses, car les lignes récentes sont voisines.

Stockez les UUID dans un type natif de 16 octets quand il existe (uuid dans PostgreSQL, BINARY(16) dans MySQL, uniqueidentifier dans SQL Server) plutôt qu'en texte de 36 caractères. Les clés en texte sont plus de deux fois plus grosses et plus lentes à comparer.

Notes par base de données : PostgreSQL, MySQL, SQL Server, .NET

  • PostgreSQL : le type uuid se trie octet par octet, l'ordre du v7 est donc conservé. PostgreSQL 18 a ajouté une fonction intégrée uuidv7() ; avec les versions plus anciennes, l'application peut fournir la valeur.
  • MySQL et MariaDB : stockez en BINARY(16) avec UUID_TO_BIN(valeur) sans l'option d'échange (swap), ce qui garde l'ordre du v7. La fonction UUID() de MySQL crée un UUID de version 1, pas un v7.
  • SQL Server : uniqueidentifier compare d'abord le dernier groupe d'octets, les valeurs v7 n'y sont donc pas rangées dans l'ordre du temps. Si vous avez besoin de clés séquentielles dans SQL Server, NEWSEQUENTIALID() ou un bigint identity est souvent le choix le plus simple.
  • .NET : Guid.NewGuid() renvoie un v4. Depuis .NET 9, Guid.CreateVersion7() renvoie un v7.
  • JavaScript : crypto.randomUUID() dans les navigateurs et Node.js renvoie un v4 ; pour le v7, il faut une bibliothèque ou une petite fonction comme celle qui fait tourner le générateur de cette page.

Le risque de collision en chiffres réels

Avec 122 bits aléatoires, une collision de v4 relève du paradoxe des anniversaires. Il faudrait environ 2,7 trillions d'UUID (2,7 x 10^18, soit 2,7 milliards de milliards) pour avoir 50 % de chances d'obtenir un seul doublon, c'est-à-dire un milliard de nouveaux identifiants par seconde pendant environ 86 ans. Un générateur aléatoire défectueux, une copie d'instantané de machine virtuelle ou un bug qui réutilise une valeur sont des causes de doublons bien plus réalistes que le hasard.

Une valeur v7 a moins de bits aléatoires, mais ils n'ont besoin d'être uniques qu'au sein de la même milliseconde. Même un service qui génère un million d'identifiants dans une milliseconde ne court aucun danger pratique. Les générateurs tiennent aussi un compteur à l'intérieur de la milliseconde, comme celui-ci, pour que des identifiants créés en rafale restent strictement ordonnés.

Gardez quand même toujours une contrainte d'unicité sur la colonne. Elle ne coûte rien et transforme un événement impossible en erreur claire plutôt qu'en données corrompues.

UUID ou GUID, et les autres versions

GUID (globally unique identifier) est le nom que Microsoft donne à l'UUID. C'est la même valeur de 128 bits ; les outils Windows l'écrivent généralement en majuscules et parfois entre accolades, comme {3F2504E0-4F89-41D3-9A0C-0305E82C3301}. Les options de format du générateur (Majuscules, Tirets, Accolades { }) couvrent ces styles.

La version 1 combine un horodatage et l'adresse de la carte réseau ; on la recommande rarement aujourd'hui, car elle peut identifier la machine. La version 6 est la version 1 réordonnée pour se trier par date. Les versions 3 et 5 sont dérivées d'un nom avec MD5 ou SHA-1 : une même entrée donne toujours le même UUID. La version 8 est libre pour des structures personnalisées. ULID est un format populaire qui n'est pas un UUID mais repose sur la même idée que le v7 ; le v7, lui, entre dans n'importe quelle colonne uuid existante.

Quand le v7 n'est pas le bon choix

  • Identifiants publics dont la date de création est sensible : un v7 dans une URL révèle quand un compte, une commande ou un document a été créé.
  • Jetons, liens d'invitation et codes de réinitialisation de mot de passe : utilisez un v4 ou un jeton aléatoire plus long, jamais quelque chose qu'on pourrait deviner à partir de l'heure.
  • Systèmes qui trient ou comparent les identifiants comme du texte ou avec un autre ordre d'octets, comme uniqueidentifier dans SQL Server.
  • Tables existantes remplies de clés v4 : mélanger les versions fonctionne, mais vous ne gagnez l'avantage sur l'index que pour les nouvelles lignes.

Étape par étape

  1. Choisissez la versionCette page démarre sur v7 ordonné dans le temps. Passez Version sur v4 aléatoire pour des identifiants entièrement aléatoires.
  2. Réglez le nombre et le formatIndiquez Combien, jusqu'à 10 000, et activez ou désactivez Majuscules, Tirets ou Accolades { } selon votre code.
  3. Copiez ou téléchargezCopiez la liste ou téléchargez-la en fichier texte. Cliquez sur Nouvelle liste pour obtenir de nouveaux identifiants.
  4. Décodez un identifiantCollez n'importe quel UUID dans le décodeur d'UUID pour voir sa version, sa variante et, pour un v7, sa date de création.

Questions fréquentes

L'UUID v7 est-il meilleur que le v4 ?

Pour les clés de base de données et les données triées par date, oui. Pour des valeurs qui ne doivent pas révéler leur date de création, le v4 est le choix le plus sûr.

Deux UUID peuvent-ils être identiques ?

En théorie oui, en pratique non. Pour avoir 50 % de chances d'un seul doublon de v4, il faudrait environ 2,7 x 10^18 identifiants. Gardez quand même une contrainte d'unicité.

Peut-on retrouver la date dans un UUID v7 ?

Oui. Les 48 premiers bits sont le temps Unix en millisecondes. Collez l'UUID dans le décodeur de cette page pour voir l'heure exacte de création.

Un GUID est-il la même chose qu'un UUID ?

Oui. GUID est le terme de Microsoft. Guid.NewGuid() crée un UUID de version 4, souvent écrit en majuscules ou entre accolades.

Faut-il stocker les UUID en texte ?

Utilisez un type natif de 16 octets quand votre base de données en a un. Le texte prend 36 octets ou plus et rend les index plus gros et plus lents.

Les UUID générés ici sont-ils envoyés quelque part ?

Non. Ils sont créés dans votre navigateur avec son générateur aléatoire sécurisé, et ne sont ni enregistrés ni envoyés.