5.1. UUID Version 1 (UUID Version 1)
5.1. UUID Version 1 (UUID Version 1)
UUIDv1 ist eine zeitbasierte UUID mit einem 60-Bit-Zeitstempel, der durch koordinierte Weltzeit (Coordinated Universal Time, UTC) als Anzahl von 100-Nanosekunden-Intervallen seit dem 15. Oktober 1582, 00:00:00.00 (dem Datum der gregorianischen Reform des christlichen Kalenders) dargestellt wird.
UUIDv1 verfügt auch über ein Uhrensequenzfeld, das verwendet wird, um Duplikate zu vermeiden, die auftreten könnten, wenn die Uhr zurückgestellt wird oder wenn sich die Knoten-ID ändert.
Das Knotenfeld besteht aus einer IEEE 802 MAC-Adresse, normalerweise der Hostadresse oder einem zufällig abgeleiteten Wert gemäß den Abschnitten 6.9 und 6.10.
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 | ver | time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Abbildung 6: UUIDv1-Feld- und Bit-Layout
Felddefinitionen:
time_low: Die niedrigstwertigen 32 Bits des 60-Bit-Startzeitstempels. Belegt die Bits 0 bis 31 (Oktette 0-3).
time_mid: Die mittleren 16 Bits des 60-Bit-Startzeitstempels. Belegt die Bits 32 bis 47 (Oktette 4-5).
ver: Das 4-Bit-Versionsfeld, wie in Abschnitt 4.2 definiert, auf 0b0001 (1) gesetzt. Belegt die Bits 48 bis 51 von Oktett 6.
time_high: Die niedrigstwertigen 12 Bits des 60-Bit-Startzeitstempels. Belegt die Bits 52 bis 63 (Oktette 6-7).
var: Das 2-Bit-Variantenfeld, wie in Abschnitt 4.1 definiert, auf 0b10 gesetzt. Belegt die Bits 64 und 65 von Oktett 8.
clock_seq: Die 14 Bits, die die Uhrensequenz enthalten. Belegt die Bits 66 bis 79 (Oktette 8-9).
node: 48-Bit räumlich eindeutiger Identifikator. Belegt die Bits 80 bis 127 (Oktette 10-15).
Für Systeme, die keine UTC verfügbar haben, aber die Ortszeit haben, können sie diese anstelle von UTC verwenden, solange sie dies im gesamten System konsistent tun. Dies wird jedoch nicht empfohlen, da die Erzeugung der UTC aus der Ortszeit nur einen Zeitzonenversatz erfordert.
Wenn die Uhr zurückgestellt wird oder möglicherweise zurückgestellt wurde (z.B. während das System ausgeschaltet war) und der UUID-Generator nicht sicher sein kann, dass keine UUIDs mit Zeitstempeln größer als dem Wert, auf den die Uhr eingestellt wurde, generiert wurden, dann MUSS (MUST) die Uhrensequenz geändert werden. Wenn der vorherige Wert der Uhrensequenz bekannt ist, KANN (MAY) er inkrementiert werden; andernfalls SOLLTE (SHOULD) er auf einen zufälligen oder hochwertigen pseudozufälligen Wert gesetzt werden.
Ähnlich, wenn sich die Knoten-ID ändert (z.B. weil eine Netzwerkkarte zwischen Maschinen verschoben wurde), minimiert das Setzen der Uhrensequenz auf eine Zufallszahl die Wahrscheinlichkeit eines Duplikats aufgrund geringfügiger Unterschiede in den Uhreneinstellungen der Maschinen. Wenn der Wert der Uhrensequenz, der mit der geänderten Knoten-ID verbunden ist, bekannt wäre, dann KANN (MAY) die Uhrensequenz inkrementiert werden, aber das ist unwahrscheinlich.
Die Uhrensequenz MUSS (MUST) ursprünglich (d.h. einmal in der Lebensdauer eines Systems) auf eine Zufallszahl initialisiert werden, um die Korrelation zwischen Systemen zu minimieren. Dies bietet maximalen Schutz gegen Knoten-IDs, die sich möglicherweise schnell zwischen Systemen bewegen oder wechseln.