UUID-Leitfaden: v4 oder v7 und UUIDs als Primärschlüssel in Datenbanken
Zeichenketten wie 550e8400-e29b-41d4-a716-446655440000 kennzeichnen überall Bestellungen, Dateien und API-Anfragen. Erfahren Sie, wie UUIDs erzeugt werden und welche Version Sie wählen sollten.
Was eine UUID ist
Eine UUID (Universally Unique Identifier) ist ein 128-Bit-Bezeichner, mit dem jeder kollisionsfreie IDs erzeugen kann, ohne einen zentralen Server zu fragen. Microsoft nennt sie GUID. Der aktuelle Standard ist RFC 9562 aus dem Jahr 2024.
Sie wird als 32 Hexadezimalziffern geschrieben, die durch Bindestriche in Gruppen zu 8-4-4-4-12 geteilt sind, insgesamt 36 Zeichen. Die erste Ziffer der dritten Gruppe gibt die Version an: xxxxxxxx-xxxx-4xxx-... ist v4, 7xxx ist v7.
Die Versionen im Überblick
Heute wählt man üblicherweise v4 für allgemeine Zwecke und v7, wenn Reihenfolge und Einfügeleistung wichtig sind, etwa bei Primärschlüsseln in Datenbanken.
- v1: kombiniert einen Zeitstempel mit der MAC-Adresse des Rechners. Zeitlich sortiert, kann aber Hardware-Informationen preisgeben.
- v3 und v5: hashen einen Namensraum und einen Namen, sodass dieselbe Eingabe immer dieselbe UUID ergibt (v3 nutzt MD5, v5 SHA-1).
- v4: 122 Zufallsbits. Am weitesten verbreitet und am einfachsten umzusetzen.
- v7: ein 48-Bit-Unix-Zeitstempel in Millisekunden, gefolgt von Zufallsbits. Sortiert sich in Erstellungsreihenfolge.
Können UUIDs wirklich nicht kollidieren?
Der Zufallsanteil einer v4-UUID umfasst 122 Bit, also rund 5,3 × 10^36 mögliche Werte. Nach dem Geburtstagsparadoxon bräuchte man etwa 2,7 × 10^18 UUIDs für eine 50-prozentige Chance auf ein einziges Duplikat — rund eine Milliarde pro Sekunde über 85 Jahre. In der Praxis kommen Kollisionen nicht vor.
Das gilt allerdings nur, wenn die Zufallszahlen wirklich zufällig sind. Duplikate wurden gemeldet, nachdem virtuelle Maschinen mit identischem Zustand des Zufallsgenerators geklont wurden, oder bei Eigenbau-Implementierungen mit vorhersagbaren Zufallsfunktionen. Verwenden Sie die Standard-UUID-Funktion Ihrer Plattform.
UUIDs als Primärschlüssel
UUID-Schlüssel lassen sich auf vielen Servern gleichzeitig erzeugen und verraten nicht, wie viele Datensätze existieren. Bei automatisch hochgezählten Ganzzahlen erlaubt eine URL wie /orders/1052 der Konkurrenz, Ihr Bestellvolumen zu schätzen.
Die Nachteile sind Größe und Reihenfolge. Eine UUID belegt 16 Bytes, doppelt so viel wie eine 8-Byte-Ganzzahl, und noch mehr als 36-Zeichen-String. Da v4 vollständig zufällig ist, landen neue Zeilen an beliebigen Stellen im B-Baum-Index, was häufige Seitenteilungen und langsamere Schreibvorgänge verursacht. v7 steigt mit der Zeit an und vermeidet das weitgehend.
- PostgreSQL: den nativen Typ uuid (16 Bytes) verwenden.
- MySQL: als BINARY(16) speichern; ab Version 8.0 gibt es UUID_TO_BIN.
- SQL Server: den Typ uniqueidentifier verwenden.
Wann eine UUID kein Geheimnis sein sollte
Eine UUID ist als eindeutiger Name gedacht, nicht als unerratbares Geheimnis. v1 und v7 enthalten einen Zeitstempel, daher sind manche Bits vorhersagbar. Sicherheitskritische Werte wie Token zum Zurücksetzen von Passwörtern und API-Secrets sollten aus ausreichend vielen kryptografisch sicheren Zufallsbytes erzeugt werden.
Erzeugen Sie mit dem UUID-Generator von AIBIZAP so viele UUIDs, wie Sie brauchen, und verwenden Sie für Geheimnisse den Client-Credential-Generator. Wenn Sie Tabellen anhand von JSON-Beispielen entwerfen, ergänzt der JSON-DDL-Generator beides gut.