UUID v7 Generator

Generate time-ordered UUID v7 for database primary keys

Formatieren

Anzahl:

Was ist UUID v7?

UUID v7 ist ein Nächste-Generation-UUID-Format, das in RFC 9562 (Mai 2024) standardisiert ist. Es kodiert einen 48-Bit-Unix-Millisekunden-Zeitstempel in den signifikantesten Bits, gefolgt von Versions- und Variantenmarkern, und füllt die restlichen Bits mit kryptografisch sicheren Zufallsdaten.

Da der Zeitstempel die hohen Bits belegt, sortieren UUID v7-Werte chronologisch — sowohl lexikografisch als auch numerisch. Das macht sie zu einer hervorragenden Wahl für Datenbankprimärschlüssel, wo zufällige UUIDs (v4) B-Tree-Index-Fragmentierung verursachen.

Warum zufällige UUIDs Datenbankindizes fragmentieren

B-Tree-Indizes — verwendet von PostgreSQL, MySQL, SQLite und den meisten anderen Datenbanken — halten Zeilen nach Schlüsselwert sortiert. Wenn Sie eine neue Zeile einfügen, muss die Datenbank sie an der richtigen sortierten Position im Index platzieren.

Mit UUID v4 (vollständig zufällig) landet jedes neue Einfügen an einer im Wesentlichen zufälligen Position im Index-Baum. Dies zwingt die Datenbank dazu, interne Index-Seiten ständig zu lesen und neu zu schreiben, volle Seiten aufzuteilen und andere halb leer zu lassen. Das Ergebnis ist ein fragmentierter, aufgeblähter Index, der mit wachsender Tabelle sowohl Schreib- als auch Lesevorgänge verlangsamt.

UUID v7 Bit-Layout

UUID v7 ist 128 Bits breit, aufgeteilt in sechs Felder:

BitsFeldZweck
48unix_ts_ms48-Bit-Unix-Zeitstempel in Millisekunden — belegt die gesamte obere Hälfte
4verVersionsnummer — immer 0111 (dezimal 7)
12rand_a12 Bits kryptografisch sicherer Zufallsdaten
2varVariantenmarker — immer 10 (RFC 4122-Variante)
62rand_b62 Bits kryptografisch sicherer Zufallsdaten

Die Zeitstempel-Präzision beträgt 1 Millisekunde. Innerhalb derselben Millisekunde werden UUID v7-Werte nach ihrem zufälligen Suffix geordnet — sie sind nicht garantiert sub-millisekunden-monoton steigend, aber sie sind k-sortierbar: IDs, die zeitlich nah beieinander generiert werden, sortieren im Index nah beieinander.

UUID v7 vs UUID v1

Sowohl UUID v1 als auch UUID v7 enthalten einen Zeitstempel, unterscheiden sich aber erheblich im Design:

MerkmalUUID v7UUID v1
Epoche / ZeitbasisUnix-Epoche (1. Jan. 1970)Gregorianische Epoche (15. Okt. 1582)
Zeitpräzision1 Millisekunde100 Nanosekunden
SortierbarJa — k-sortierbar by designNein — Zeitfelder sind im UUID-Layout verstreut
DatenschutzKeine Host-Informationen preisgegebenEnthält MAC-Adresse des generierenden Hosts
DB-Index-PerformanceHervorragend — sequentielle Einfügungen, minimale FragmentierungSchlecht — nicht-sequentiell trotz Zeitstempel
StandardRFC 9562 (2024)RFC 4122 (2005)
Native Browser-UnterstützungNoch nicht (kein crypto.randomUUID v7)Nativ nicht verfügbar

Für jedes neue Projekt, das zeitgeordnete UUIDs benötigt, bevorzugen Sie UUID v7 gegenüber UUID v1. UUID v1 ist ein Legacy-Format und gibt Host-Informationen preis.

UUID v7 vs ULID

ULID (Universally Unique Lexicographically Sortable Identifier) löst ein ähnliches Problem wie UUID v7. Hier ist ein Vergleich:

UUID v7
  • Folgt dem RFC 9562 UUID-Standard — kompatibel mit allen UUID-Tools
  • Bindestriche-Hex-Format — universell erkannt
  • Native Datenbank-UUID-Spalten-Unterstützung
  • 128 Bits insgesamt
ULID
  • Crockford Base32-Kodierung — 26 Zeichen, etwas kompakter
  • Groß-/Kleinschreibung-unabhängig und vermeidet mehrdeutige Zeichen (I, L, O, U)
  • Auf den ersten Blick besser menschenlesbar
  • Erfordert eine Bibliothek — keine native Plattform-Unterstützung

Wenn Sie bereits in einem UUID-Ökosystem sind (PostgreSQL uuid-Spalte, REST-APIs, die UUIDs zurückgeben), verwenden Sie UUID v7. Wenn Sie neu beginnen und eine menschenfreundlichere Kodierung bevorzugen, ist ULID eine sinnvolle Alternative.

UUID v7 in Datenbanken verwenden

UUID v7 wird noch nicht nativ von den meisten Datenbanken generiert, kann aber in Standard-UUID-Spalten gespeichert und im Anwendungscode oder über Erweiterungen generiert werden:

PostgreSQL
PostgreSQL: in einer uuid-Spalte speichern. Die Erweiterung pg-uuidv7 fügt eine serverseitige Funktion uuid_generate_v7() hinzu, wenn Sie datenbankgenerierte IDs benötigen.
MySQL / MariaDB
MySQL / MariaDB: in einer BINARY(16)- oder CHAR(36)-Spalte speichern. Im Anwendungscode generieren. MySQL 8.0+ hat geordnete UUID-Unterstützung über UUID_TO_BIN(UUID(), 1) für v1, aber v7 erfordert App-Level-Generierung.
SQLite
SQLite: als TEXT (36 Zeichen) oder BLOB (16 Bytes) speichern. Im Anwendungscode generieren. Lexikografische Sortierung auf TEXT funktioniert korrekt, da UUID v7 ein Zeitstempel-Präfix fester Breite verwendet.

Code-Beispiele

UUID v7 ist noch nicht über crypto.randomUUID() verfügbar. Verwenden Sie eine Bibliothek wie uuidv7 (npm), bis native Unterstützung kommt:

JavaScript (browser / Node.js 20+)
function generateUuidV7() {
  const buf = new Uint8Array(16)
  crypto.getRandomValues(buf)

  const ms = BigInt(Date.now())

  // Embed 48-bit Unix ms timestamp
  buf[0] = Number((ms >> 40n) & 0xFFn)
  buf[1] = Number((ms >> 32n) & 0xFFn)
  buf[2] = Number((ms >> 24n) & 0xFFn)
  buf[3] = Number((ms >> 16n) & 0xFFn)
  buf[4] = Number((ms >> 8n)  & 0xFFn)
  buf[5] = Number(ms & 0xFFn)

  // Set version 7 (0111xxxx)
  buf[6] = (buf[6] & 0x0F) | 0x70

  // Set variant (10xxxxxx)
  buf[8] = (buf[8] & 0x3F) | 0x80

  const hex = [...buf].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`
}

// Node.js 20+ built-in
// import { randomUUID } from 'node:crypto'  // v4 only — no v7 yet in stdlib
Python (uuid7 library)
# pip install uuid7
import uuid_extensions

uid = uuid_extensions.uuid7()
print(uid)                       # e.g. 018e2b3d-1a2b-7000-8000-abc123456789
print(uid.time)                  # Unix ms timestamp embedded in the UUID

# Or as a plain string
from uuid_extensions import uuid7str
print(uuid7str())
PostgreSQL — generate UUID v7
-- PostgreSQL 13+ extension-free implementation
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid
LANGUAGE sql
AS $$
  SELECT encode(
    set_bit(
      set_bit(
        overlay(
          uuid_send(gen_random_uuid())
          PLACING substring(int8send(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint) FROM 3)
          FROM 1 FOR 6
        ),
        52, 1
      ),
      53, 1
    ),
    'hex'
  )::uuid;
$$;

-- Usage as a default primary key
CREATE TABLE events (
  id uuid PRIMARY KEY DEFAULT uuid_generate_v7(),
  payload jsonb,
  created_at timestamptz DEFAULT now()
);
TypeScript — extract timestamp from UUID v7
function extractTimestamp(uuid: string): Date {
  const hex = uuid.replace(/-/g, '')
  const ms = parseInt(hex.slice(0, 12), 16)  // first 48 bits = ms timestamp
  return new Date(ms)
}

const uid = '018e2b3d-1a2b-7000-8000-abc123456789'
console.log(extractTimestamp(uid).toISOString())
// → "2024-03-15T10:22:05.259Z"

Häufig gestellte Fragen

Ist UUID v7 abwärtskompatibel mit UUID v4?
Ja. UUID v7 verwendet dasselbe 128-Bit-, 32-Hex-Ziffern-, Bindestriche-Drahtformat wie alle anderen UUID-Versionen. Jedes System, das UUIDs speichert oder überträgt, akzeptiert einen UUID v7 ohne Änderungen. Das Versions-Nibble (7) und die Varianten-Bits identifizieren es als v7 für Tools, die die UUID-Struktur untersuchen.
Gibt UUID v7 den Generierungszeitstempel preis?
Ja — die ersten 48 Bits sind ein Unix-Millisekunden-Zeitstempel, sodass jeder mit der UUID ungefähr bestimmen kann, wann sie generiert wurde (auf die nächste Millisekunde genau). Wenn die Offenlegung der Erstellungszeit für Ihren Anwendungsfall problematisch ist, verwenden Sie stattdessen UUID v4.
Kann ich UUID v7 als Datenbankprimärschlüssel ohne eine separate created_at-Spalte verwenden?
Ja. Da UUID v7 einen Millisekunden-Zeitstempel enthält, können Sie diesen Wert dekodieren, um die ungefähre Erstellungszeit zu erhalten. Für Klarheit und Indizierbarkeit behalten viele Teams jedoch eine explizite created_at-Spalte und verwenden UUID v7 nur für die ID-Spalte.
Wie viel Entropie hat UUID v7?
UUID v7 hat 74 Bits Zufallsdaten (12 Bits in rand_a + 62 Bits in rand_b). Das ist etwas weniger als UUID v4's 122 Bits, bietet aber immer noch einen astronomisch großen kollisionsfreien Raum für die praktische Nutzung. Die reduzierte Zufälligkeit ist der Kompromiss für die Zeitstempel-Sortierbarkeit.
Wird UUID v7 nativ in Browsern oder Node.js unterstützt?
Noch nicht, Stand Anfang 2025. Der RFC 9562-Standard wurde im Mai 2024 veröffentlicht, und die Plattformunterstützung holt noch auf. Verwenden Sie vorerst das npm-Paket uuidv7. Native Unterstützung über crypto.randomUUID({ version: 7 }) oder ähnliche APIs könnte in zukünftigen Browser- und Node.js-Versionen kommen.