Ein einzelner Server könnte theoretisch eine Milliarde zufällige UUIDs pro Sekunde erzeugen, hundert Jahre lang durchgehend, und die Wahrscheinlichkeit, dass dabei irgendwann zwei identische entstehen, läge immer noch unter einem Promille. Das ist keine Werbeaussage, sondern schlicht die Mathematik des Geburtstagsparadoxons angewandt auf einen 128-Bit-Zahlenraum. Genau diese Sicherheitsmarge macht UUIDs so praktisch: Man muss sich um Kollisionen im Grunde keine Gedanken mehr machen.
Was in dieser Zahl steckt
Eine UUID (Universally Unique Identifier) ist eine 128-Bit-Zahl, die ohne zentrale Vergabestelle als eindeutig gilt. Jeder Service, jeder Client, jede Datenbank kann eigenständig UUIDs erzeugen, ohne sich mit anderen Komponenten abzustimmen. Dargestellt wird sie üblicherweise als 36-stelliger Hex-String mit Bindestrichen, etwa f47ac10b-58cc-4372-a567-0e02b2c3d479. Je nach Version stecken in diesen 128 Bit unterschiedliche Informationen: mal reiner Zufall, mal ein eingebetteter Zeitstempel.
Die gängigen Versionen im Überblick
- Version 1 (zeit- und MAC-basiert): Enthält Zeitstempel und MAC-Adresse des erzeugenden Geräts. Kollisionssicher, verrät aber Details über den Generator. Heute selten im Einsatz.
- Version 3 und 5 (namensraumbasiert): Ein Hash aus Namespace und Name (MD5 bei v3, SHA-1 bei v5). Dieselbe Eingabe erzeugt immer dieselbe UUID, praktisch für deterministische IDs.
- Version 4 (zufällig): 122 echte Zufallsbits, Standard für die meisten Anwendungsfälle.
- Version 6 (reordered v1): Wie v1, nur mit sortierbarem Zeitstempel.
- Version 7 (zeitbasiert, RFC 9562, seit 2022 standardisiert): Ein 48-Bit-Unix-Zeitstempel vorne, der Rest zufällig. Als Primärschlüssel B-Tree-freundlich und trotzdem global eindeutig.
v4 gegen v7: der Unterschied, der beim Index zählt
UUID v4 ist vollständig zufällig verteilt, was für Datenschutz spricht, aber als Primärschlüssel Nachteile hat: Neu eingefügte Zeilen landen kreuz und quer im B-Tree-Index der Datenbank, was Inserts verlangsamt und den Index fragmentiert. UUID v7 beginnt dagegen mit einem Zeitstempel, wodurch neue Werte im Index hinten angehängt werden, ähnlich wie bei einer klassischen Auto-Increment-Spalte, während sie trotzdem weltweit eindeutig bleiben. Für neue Systeme ist v7 daher meist die bessere Wahl, sofern Datenbank und ORM sie unterstützen.
Warum sich UUIDs gegenüber hochzählenden IDs lohnen
- Erzeugung ohne Abstimmung: Client-Geräte, Background-Worker und Microservices können unabhängig voneinander IDs vergeben.
- Keine Geschäftszahlen sichtbar: Eine hochzählende ID wie
/order/5839verrät, wie viele Bestellungen es insgesamt gibt. Eine UUID tut das nicht. - Einfachere Zusammenführung: Daten aus mehreren Systemen lassen sich ohne ID-Konflikte kombinieren.
- Schwerer zu erraten:
/order/5840lässt sich einfach durchprobieren, eine zufällige UUID nicht.
Wo UUIDs im Alltag auftauchen
- Primärschlüssel in SQL- und NoSQL-Datenbanken.
- Dateinamen bei Uploads, um Namenskonflikte zu vermeiden.
- Idempotenzschlüssel bei wiederholbaren API-Aufrufen.
- Trace- und Span-IDs im verteilten Tracing.
- Session- und Nonce-Werte.
Wann UUIDs die falsche Wahl sind
UUIDs sind kein Allheilmittel. Als reine Auto-Increment-Alternative in einer kleinen, einzelnen Datenbank sind sie oft schlicht Overkill, ein normaler Integer ist kleiner, schneller zu indexieren und für Menschen leichter zu merken. Auch für öffentlich sichtbare, kurze IDs (etwa in einer URL, die man vorlesen möchte) sind UUIDs unpraktisch lang. Und für Session-Tokens, bei denen es auf kryptografische Unvorhersagbarkeit ankommt, sollten Sie sich nicht allein auf UUID v4 verlassen, sondern besser einen dediziert generierten Zufallswert verwenden.
Datenschutz
UUIDs werden im Browser mit der Web Crypto API erzeugt (crypto.randomUUID() beziehungsweise crypto.getRandomValues). Es werden keine Werte an unseren Server übermittelt, das Tool funktioniert auch offline.