UUID Version 7 Generator
UUIDv7 • Zeitlich Sortiert (RFC 9562)
00000000-0000-0000-0000-000000000000
Einschließen:
Massen-UUID-Generierung
0 msReady
Max. 5.000
Formatierung & Struktur
Bereit
No batch active1-click copy available on each row
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.
| Feldname | Bit-Bereich | Zweck & Beschreibung |
|---|---|---|
| unix_ts_ms | 48 Bit (0-47) | Unsigned Unix-Epoch-Zeitstempel in Millisekunden (Big-Endian). |
| ver | 4 Bit (48-51) | Konstanter Binärwert 0111 (identifiziert Version 7). |
| rand_a | 12 Bit (52-63) | Zufallsentropie oder Sub-Millisekunden-Sequenzzähler. |
| var | 2 Bit (64-65) | Konstanter Binärwert 10 (RFC 4122/9562 Standard-Variante). |
| rand_b | 62 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-128a9b345678PostgreSQL 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.