Zum Hauptinhalt springen

UUID Version 7 Generator

UUIDv7 • Zeitlich Sortiert (RFC 9562)
00000000-0000-0000-0000-000000000000
Einschließen:

Massen-UUID-Generierung

Max. 5.000
Formatierung & Struktur

Bereit

No batch active
Moderner Standard (2024)RFC 9562 Abschnitt 5.7

UUID Version 7 Technische Spezifikation (RFC 9562)

UUIDv7 kombiniert einen 48-Bit-Unix-Zeitstempel (in Millisekunden) mit 74 Bit kryptografischer Zufallsentropie und Sequenzdaten. Die Version wurde im RFC 9562 (2024) standardisiert, um B-Tree-Index-Fragmentierung und Paging-Verluste in Datenbanken durch herkömmliche zufällige UUIDv4-Schlüssel endgültig zu lösen.

Bitfeld-Layout & Binärstruktur

Detaillierte 128-Bit-Byte-Verteilung nach RFC-Standards.

FeldnameBit-BereichZweck & Beschreibung
unix_ts_ms48 Bit (0-47)Unsigned Unix-Epoch-Zeitstempel in Millisekunden (Big-Endian).
ver4 Bit (48-51)Konstanter Binärwert 0111 (identifiziert Version 7).
rand_a12 Bit (52-63)Zufallsentropie oder Sub-Millisekunden-Sequenzzähler.
var2 Bit (64-65)Konstanter Binärwert 10 (RFC 4122/9562 Standard-Variante).
rand_b62 Bit (66-127)Kryptografisch sichere Pseudozufalls-Entropie-Bits.

Vorteile & Stärken

  • Natürliche zeitliche Sortierbarkeit; ideal für geclusterte B-Tree-Indizes (PostgreSQL, MySQL, SQLite).
  • Verhindert zufällige Festplatten-I/O, Cache-Verdrängung und B-Tree-Page-Splits bei Massen-Inserts.
  • 74 Bit Entropie pro Millisekunde schließen Kollisionen in verteilten Microservices aus.
  • Der Erstellungszeitpunkt kann direkt aus der UUID decodiert werden, ohne die Datenbank abzufragen.
!

Einschränkungen & Kompromisse

  • Offenbart in öffentlichen URLs den ungefähren Erstellungszeitpunkt (Millisekunden-Auflösung).
  • Erfordert einen monotonen Zähler bei mehreren Generierungen innerhalb derselben Millisekunde.

Am besten geeignet für

  • Primärschlüssel in relationalen und dokumentbasierten Datenbanken (PostgreSQL, MySQL, CockroachDB, MongoDB).
  • Event-Streaming, Audit-Logs und Nachrichten-Warteschlangen (Kafka, RabbitMQ, SQS).
  • Zeitreihendaten und chronologische Journale.

Vermeiden bei

  • Sicherheitstoken oder geheime Session-Cookies, bei denen der Erstellungszeitpunkt geheim bleiben muss.
  • Systeme, die einfache fortlaufende Ganzzahlen ohne Zeitstempel verlangen.

Code-Implementierungsbeispiele

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;

Häufig gestellte Fragen

Warum sollte man von UUIDv4 auf UUIDv7 umsteigen?
UUIDv4 erzeugt zufällige Schreibzugriffe in B-Trees und führt zu extremer Index-Fragmentierung. UUIDv7 wird sequentiell am Indexende angehängt und erzielt bis zu 4-mal höhere Insert-Geschwindigkeiten.
Ist UUIDv7 mit bestehenden UUIDv4-Spalten kompatibel?
Ja, beide Formate nutzen exakt dieselbe 128-Bit-Darstellung (32 Hex-Ziffern mit 4 Bindestrichen) und sind ohne Schema-Änderung 100% kompatibel.
Können zwei in derselben Millisekunde erzeugte UUIDv7 kollidieren?
Nein. Dank 74 Bit Entropie und Sequenzierung können pro Millisekunde Milliarden Kennungen ohne Kollision erzeugt werden.