4. Spezifikation (Specification)
4.1. Format
Das UUID-Format beträgt 16 Oktetts; einige Bits des unten spezifizierten Acht-Oktett-Variantenfelds bestimmen eine feinere Struktur.
4.1.1. Variante (Variant)
Das Variantenfeld bestimmt das Layout der UUID. Das heißt, die Interpretation aller anderen Bits in der UUID hängt von der Einstellung der Bits im Variantenfeld ab. Das Variantenfeld besteht aus einer variablen Anzahl der höchstwertigen Bits von Oktett 8 der UUID.
Die folgende Tabelle listet den Inhalt des Variantenfelds auf, wobei der Buchstabe "x" einen "beliebigen" Wert anzeigt.
| Msb0 | Msb1 | Msb2 | Beschreibung (Description) |
|---|---|---|---|
| 0 | x | x | Reserviert, NCS-Rückwärtskompatibilität |
| 1 | 0 | x | Die in diesem Dokument spezifizierte Variante |
| 1 | 1 | 0 | Reserviert, Microsoft Corporation-Rückwärtskompatibilität |
| 1 | 1 | 1 | Für zukünftige Definition reserviert |
4.1.2. Layout und Byte-Reihenfolge (Layout and Byte Order)
Um Verwirrung über Bitzuweisungen innerhalb von Oktetts zu minimieren, ist die UUID-Datensatzdefinition nur in Bezug auf Felder definiert, die ganzzahlige Vielfache von Oktetts sind. Die Felder werden mit dem bedeutendsten zuerst dargestellt.
| Feld | Datentyp | Oktett # | Bemerkung |
|---|---|---|---|
| time_low | vorzeichenlose 32-Bit-Ganzzahl | 0-3 | Das untere Feld des Zeitstempels |
| time_mid | vorzeichenlose 16-Bit-Ganzzahl | 4-5 | Das mittlere Feld des Zeitstempels |
| time_hi_and_version | vorzeichenlose 16-Bit-Ganzzahl | 6-7 | Das obere Feld des Zeitstempels multiplexiert mit der Versionsnummer |
| clock_seq_hi_and_reserved | vorzeichenlose 8-Bit-Ganzzahl | 8 | Das obere Feld der Taktsequenz multiplexiert mit der Variante |
| clock_seq_low | vorzeichenlose 8-Bit-Ganzzahl | 9 | Das untere Feld der Taktsequenz |
| node | vorzeichenlose 48-Bit-Ganzzahl | 10-15 | Der räumlich eindeutige Knotenidentifikator |
UUID-Struktur (128 Bits):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4.1.3. Version
Die Versionsnummer befindet sich in den höchstwertigen 4 Bits des Zeitstempels (Bits 4 bis 7 des Felds time_hi_and_version).
Die folgende Tabelle listet die derzeit für diese UUID-Variante definierten Versionen auf:
| Msb0-3 | Version | Beschreibung |
|---|---|---|
| 0001 | 1 | Die in diesem Dokument spezifizierte zeitbasierte Version |
| 0010 | 2 | DCE-Sicherheitsversion mit eingebetteten POSIX-UIDs |
| 0011 | 3 | Die in diesem Dokument spezifizierte namensbasierte Version, die MD5-Hashing verwendet |
| 0100 | 4 | Die in diesem Dokument spezifizierte zufällig oder pseudozufällig generierte Version |
| 0101 | 5 | Die in diesem Dokument spezifizierte namensbasierte Version, die SHA-1-Hashing verwendet |
4.1.4. Zeitstempel (Timestamp)
Der Zeitstempel ist ein 60-Bit-Wert. Für UUID Version 1 wird dies durch die Koordinierte Weltzeit (UTC) als Anzahl von 100-Nanosekunden-Intervallen seit 00:00:00.00, 15. Oktober 1582 (dem Datum der gregorianischen Reform des christlichen Kalenders) dargestellt.
Für UUID Version 3 oder 5 ist der Zeitstempel ein 60-Bit-Wert, der aus einem Namen konstruiert wird, wie in Abschnitt 4.3 beschrieben.
Für UUID Version 4 ist der Zeitstempel ein zufällig oder pseudozufällig generierter 60-Bit-Wert, wie in Abschnitt 4.4 beschrieben.
4.1.5. Taktsequenz (Clock Sequence)
Für UUID Version 1 wird die Taktsequenz verwendet, um Duplikate zu vermeiden, die auftreten könnten, wenn die Uhr zeitlich zurückgestellt wird oder wenn sich die Knoten-ID ändert.
Die Taktsequenz muss (MUST) ursprünglich (d.h. einmal in der Lebensdauer eines Systems) auf eine Zufallszahl initialisiert werden, um die Korrelation zwischen Systemen zu minimieren.
Für UUID Version 3 oder 5 ist die Taktsequenz ein 14-Bit-Wert, der aus einem Namen konstruiert wird, wie in Abschnitt 4.3 beschrieben.
Für UUID Version 4 ist die Taktsequenz ein zufällig oder pseudozufällig generierter 14-Bit-Wert.
4.1.6. Knoten (Node)
Für UUID Version 1 besteht das Knotenfeld aus einer IEEE 802-MAC-Adresse, normalerweise der Host-Adresse. Für Systeme mit mehreren IEEE 802-Adressen kann jede verfügbare Adresse verwendet werden.
Für UUID Version 3 oder 5 ist das Knotenfeld ein 48-Bit-Wert, der aus einem Namen konstruiert wird, wie in Abschnitt 4.3 beschrieben.
Für UUID Version 4 ist das Knotenfeld ein zufällig oder pseudozufällig generierter 48-Bit-Wert.
4.1.7. Null-UUID (Nil UUID)
Die Null-UUID ist eine spezielle Form der UUID, die so spezifiziert ist, dass alle 128 Bits auf Null gesetzt sind:
00000000-0000-0000-0000-000000000000
4.2. Algorithmen zur Erstellung einer zeitbasierten UUID (Algorithms for Creating a Time-Based UUID)
4.2.1. Grundalgorithmus (Basic Algorithm)
Der Grundalgorithmus zur Generierung einer zeitbasierten UUID:
- Ein systemweites globales Lock erhalten
- Die aktuelle Zeit lesen
- Die aktuelle Knoten-ID abrufen
- Wenn sich die Knoten-ID seit der letzten UUID-Generierung geändert hat, die Taktsequenz auf einen Zufallswert setzen
- Wenn die aktuelle Zeit vor dem letzten Zeitstempel liegt, die Taktsequenz inkrementieren
- Den Zeitstempel und die Knoten-ID speichern
- Das globale Lock freigeben
- Die UUID unter Verwendung von Zeitstempel, Taktsequenz und Knoten-ID formatieren
4.2.2. Generierungsdetails (Generation Details)
Zeitstempel: Der Zeitstempel ist ein 60-Bit-Wert, der aus der Systemzeit konstruiert wird. Die Zeitstempelauflösung beträgt 100 Nanosekunden.
Taktsequenz: Die Taktsequenz wird zunächst auf einen Zufallswert gesetzt. Sie wird jedes Mal inkrementiert, wenn die Uhr rückwärts läuft oder sich die Knoten-ID ändert.
Knoten-ID: Die Knoten-ID ist typischerweise eine IEEE 802-MAC-Adresse.
4.3. Algorithmus zur Erstellung einer namensbasierten UUID (Algorithm for Creating a Name-Based UUID)
Der Algorithmus zur Erstellung einer namensbasierten UUID (Version 3 oder Version 5):
- Eine UUID als "Namensraum-ID" für alle aus Namen in diesem Namensraum generierten UUIDs zuweisen
- Entweder MD5 (Version 3) oder SHA-1 (Version 5) als Hash-Algorithmus wählen
- Den Namen in eine kanonische Sequenz von Oktetts konvertieren
- Den Hash der Namensraum-ID konkateniert mit dem Namen berechnen
- Die Oktetts Null bis Fünfzehn auf die Oktetts Null bis Fünfzehn des Hashs setzen
- Die vier höchstwertigen Bits (Bits 12 bis 15) von Oktett 6 auf die entsprechende Versionsnummer setzen
- Die zwei höchstwertigen Bits (Bits 6 und 7) von Oktett 8 auf Null bzw. Eins setzen
4.4. Algorithmen zur Erstellung einer UUID aus echten oder pseudozufälligen Zahlen (Algorithms for Creating a UUID from Truly Random or Pseudo-Random Numbers)
Die UUID Version 4 ist für die Generierung von UUIDs aus echten oder pseudozufälligen Zahlen gedacht.
Der Algorithmus lautet wie folgt:
- Alle Bits auf zufällig (oder pseudozufällig) gewählte Werte setzen
- Die vier höchstwertigen Bits (Bits 12 bis 15) von Oktett 6 auf die 4-Bit-Versionsnummer (0100 binär) setzen
- Die zwei höchstwertigen Bits (Bits 6 und 7) von Oktett 8 auf Null bzw. Eins setzen
4.5. Knoten-IDs, die den Host nicht identifizieren (Node IDs that Do Not Identify the Host)
Dieser Abschnitt beschreibt Alternativen zur Generierung von Knoten-IDs, die den Host nicht identifizieren:
-
Zufällige Knoten-ID: Das niederwertigste Bit des ersten Oktetts der Knoten-ID auf Eins setzen (Multicast-Bit). Dies markiert die UUID als nicht auf einer echten MAC-Adresse basierend.
-
Persistente zufällige Knoten-ID: Eine zufällige Knoten-ID einmal generieren und zur Wiederverwendung speichern. Dies bietet Konsistenz über Neustarts hinweg bei gleichzeitiger Wahrung der Privatsphäre.
Hinweis: Für detaillierte Implementierungsbeispiele und vollständige Algorithmen verweisen Sie bitte auf die offizielle RFC 4122-Spezifikation und Anhang A.