Eine UUID ist eine 128-Bit-Kennung, die Sie überall ohne zentrale Registrierung generieren können und der Sie dennoch vertrauen können, dass sie eindeutig ist. Aber nicht alle UUIDs sind gleich aufgebaut. In diesem Handbuch werden die fünf Versionen erläutert, denen Sie tatsächlich begegnen werden, warum Version 7 bei Datenbankschlüsseln gewinnt, wie Namespace-UUIDs deterministisch bleiben und wie unwahrscheinlich eine Kollision tatsächlich ist.
v4 vs. v7 – zufällig vs. zeitlich geordnet
Version 4 besteht aus 122 Bit reiner Zufälligkeit und ist damit die einfachste und am weitesten verbreitete UUID. Seine Schwäche zeigt sich im Maßstab: Da die Werte ungeordnet sind, verstreut das Einfügen von v4-Schlüsseln in einen Datenbankindex die Schreibvorgänge über den gesamten B-Baum, was zu Seitenaufteilungen und Cache-Fehlern führt.
Version 7 behebt dieses Problem, indem in den oberen Bits ein 48-Bit-Unix-Millisekunden-Zeitstempel platziert wird. Das Ergebnis weist immer noch ausreichend Zufälligkeit für die Eindeutigkeit auf, aber aufeinanderfolgende UUIDs teilen sich ein führendes Präfix, sodass neue Zeilen nahe aneinander angehängt werden. Dadurch bleiben Indizes kompakt und Einfügungen erfolgen schnell – weshalb Version 7 zunehmend die Standardeinstellung für neue Primärschlüssel ist.
Namespace-UUIDs (v5 und v3)
Versionen 5 und 3 sind deterministisch. Sie geben ihnen eine Namespace-UUID und einen Namen; Sie verketten die Bytes und hashen sie – SHA-1 für Version 5, MD5 für Version 3 – und erstellen dann eine UUID aus dem Digest. Dieselben Eingaben erzeugen immer dieselbe UUID, was sich perfekt zum Ableiten einer stabilen ID von etwas eignet, das Sie bereits haben, wie einer URL oder einem Dateipfad.
Bevorzugen Sie v5 gegenüber v3: SHA-1 ist stärker als MD5 und v3 existiert hauptsächlich aus Kompatibilitätsgründen mit älteren Systemen. RFC 4122 liefert vier Standard-Namespaces (DNS, URL, OID, X.500), und Sie können Ihren eigenen definieren, indem Sie eine beliebige UUID als Namespace angeben.
Wie wahrscheinlich ist eine Kollision?
Mit 122 Zufallsbits schöpft Version 4 aus etwa 5,3 × 1036 möglichen Werten. Mit der Geburtstagsproblem-Näherung müssten Sie ungefähr 2,71 × 1018 (2,71 Trillionen) UUIDs generieren, bevor Sie auch nur eine 50-prozentige Wahrscheinlichkeit einer einzelnen Kollision erreichen – ungefähr eine Milliarde UUIDs pro Sekunde für 85 Jahre.
v7 enthält weniger Zufallsbits (74), schränkt sie aber auf eine einzelne Millisekunde ein, sodass das praktische Kollisionsrisiko nur dann von Bedeutung ist, wenn Sie enorme Volumina generieren innerhalb derselben Millisekunde auf derselben Maschine. Für praktisch jede Anwendung können beide Versionen als kollisionsfrei betrachtet werden.