Aller au contenu principal

Générateur de UUID Version 7

UUIDv7 • Horodaté et Triable (RFC 9562)
00000000-0000-0000-0000-000000000000
Encadrer :

Génération d’UUIDs en Lot

Max 5 000
Formatage et Structure

Prêt

No batch active
Standard Moderne (2024)RFC 9562 Section 5.7

Spécification Technique de l’UUID Version 7 (RFC 9562)

L’UUIDv7 associe un horodatage Unix de 48 bits (en millisecondes) à 74 bits d’entropie cryptographique et de données de séquence. Il a été normalisé dans la RFC 9562 (2024) afin de résoudre définitivement la dégradation des index B-Tree et la fragmentation des pages mémoire causées par les clés aléatoires UUIDv4.

Structure des Bits & Format Binaire

Répartition détaillée des 128 bits selon les standards RFC.

ChampPlage de BitsRôle & Description
unix_ts_ms48 bits (0-47)Horodatage Unix Epoch non signé en millisecondes (big-endian).
ver4 bits (48-51)Valeur binaire constante 0111 (identifie la Version 7).
rand_a12 bits (52-63)Entropie pseudo-aléatoire ou compteur de séquence sub-milliseconde.
var2 bits (64-65)Valeur binaire constante 10 (variante standard RFC 4122/9562).
rand_b62 bits (66-127)Bits d’entropie pseudo-aléatoire cryptographiquement sûrs.

Avantages & Points forts

  • Tri chronologique naturel ; idéal pour les index B-Tree en grappe (PostgreSQL, MySQL, SQLite).
  • Élimine les I/O disque aléatoires, les défauts de cache et le fractionnement de pages B-Tree lors des insertions massives.
  • 74 bits d’entropie par milliseconde éliminant tout risque de collision dans les architectures microservices distribuées.
  • Extraction directe de la date de création sans requête supplémentaire en base de données.
!

Considérations & Compromis

  • Révèle l’instant approximatif de création (précision à la milliseconde) dans les URLs publiques.
  • Nécessite un compteur monotone pour générer plusieurs identifiants dans la même milliseconde.

Idéal pour

  • Clés primaires dans les bases de données relationnelles et documentaires (PostgreSQL, MySQL, CockroachDB, MongoDB).
  • Flux d’événements, journaux d’audit et files d’attente de messages (Kafka, RabbitMQ, SQS).
  • Données temporelles et registres d’historique chronologique.

À éviter pour

  • Jetons de sécurité ou cookies de session confidentiels où l’horodatage doit rester secret.
  • Systèmes nécessitant des entiers séquentiels sans surcharge temporelle.

Exemples d'implémentation de code

Native Node.js / BrowserTypeScript / Node.js
// Browser / Node 22+ with Web Crypto
function generateUUIDv7(): string {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  const now = Date.now();

  bytes[0] = (now / 0x10000000000) & 0xff;
  bytes[1] = (now / 0x100000000) & 0xff;
  bytes[2] = (now / 0x1000000) & 0xff;
  bytes[3] = (now / 0x10000) & 0xff;
  bytes[4] = (now / 0x100) & 0xff;
  bytes[5] = now & 0xff;

  bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant

  return [...bytes].map((b, i) =>
    (i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '') + b.toString(16).padStart(2, '0')
  ).join('');
}
Python (uuid6 / 3.14+)Python
import uuid6

new_id = uuid6.uuid7()
print(new_id) # e.g. 018e6a12-8921-71e4-8a4e-128a9b345678
PostgreSQL FunctionPostgreSQL
-- PostgreSQL 13+ native UUIDv7 generator
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid AS $$
DECLARE
  v_time numeric = extract(epoch FROM clock_timestamp()) * 1000;
  v_bytes bytea = gen_random_bytes(16);
BEGIN
  v_bytes = set_byte(v_bytes, 0, (v_time::bigint >> 40)::int);
  v_bytes = set_byte(v_bytes, 1, (v_time::bigint >> 32)::int);
  v_bytes = set_byte(v_bytes, 2, (v_time::bigint >> 24)::int);
  v_bytes = set_byte(v_bytes, 3, (v_time::bigint >> 16)::int);
  v_bytes = set_byte(v_bytes, 4, (v_time::bigint >> 8)::int);
  v_bytes = set_byte(v_bytes, 5, (v_time::bigint)::int);
  v_bytes = set_byte(v_bytes, 6, (get_byte(v_bytes, 6) & 15) | 112);
  v_bytes = set_byte(v_bytes, 8, (get_byte(v_bytes, 8) & 63) | 128);
  RETURN encode(v_bytes, 'hex')::uuid;
END;
$$ LANGUAGE plpgsql VOLATILE;

Foire Aux Questions

Pourquoi passer de l’UUIDv4 à l’UUIDv7 ?
L’UUIDv4 insère des données aléatoirement dans les index B-Tree, causant une fragmentation sévère. L’UUIDv7 s’ajoute de façon ordonnée en fin d’index, offrant jusqu’à 4 fois plus de débit d’insertion.
L’UUIDv7 est-il compatible avec les colonnes UUID existantes ?
Oui. Il partage le même format de 128 bits (32 caractères hexadécimaux et 4 tirets) et est 100% rétrocompatible sans modification de schéma.
Deux UUIDv7 créés dans la même milliseconde peuvent-ils entrer en collision ?
Non. Ils disposent de 74 bits d’entropie et de séquençage, permettant de générer des milliards d’identifiants par milliseconde sans collision.