5.1. UUID Version 1 (UUID Versione 1)
5.1. UUID Version 1 (UUID Versione 1)
UUIDv1 è un UUID basato sul tempo che presenta un timestamp di 60 bit rappresentato dal tempo universale coordinato (Coordinated Universal Time, UTC) come conteggio di intervalli di 100 nanosecondi dal 15 ottobre 1582, 00:00:00.00 (la data della riforma gregoriana del calendario cristiano).
UUIDv1 presenta anche un campo di sequenza dell'orologio utilizzato per evitare duplicati che potrebbero sorgere quando l'orologio viene impostato indietro nel tempo o se l'ID del nodo cambia.
Il campo del nodo è costituito da un indirizzo MAC IEEE 802, solitamente l'indirizzo dell'host o un valore derivato casualmente secondo le sezioni 6.9 e 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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figura 6: Layout dei campi e dei bit UUIDv1
Definizioni dei campi:
time_low: I 32 bit meno significativi del timestamp iniziale di 60 bit. Occupa i bit da 0 a 31 (ottetti 0-3).
time_mid: I 16 bit centrali del timestamp iniziale di 60 bit. Occupa i bit da 32 a 47 (ottetti 4-5).
ver: Il campo di versione di 4 bit come definito dalla sezione 4.2, impostato su 0b0001 (1). Occupa i bit da 48 a 51 dell'ottetto 6.
time_high: I 12 bit meno significativi del timestamp iniziale di 60 bit. Occupa i bit da 52 a 63 (ottetti 6-7).
var: Il campo di variante di 2 bit come definito dalla sezione 4.1, impostato su 0b10. Occupa i bit 64 e 65 dell'ottetto 8.
clock_seq: I 14 bit contenenti la sequenza dell'orologio. Occupa i bit da 66 a 79 (ottetti 8-9).
node: Identificatore univoco spaziale di 48 bit. Occupa i bit da 80 a 127 (ottetti 10-15).
Per i sistemi che non hanno UTC disponibile ma hanno l'ora locale, possono utilizzarla al posto di UTC purché lo facciano in modo coerente in tutto il sistema. Tuttavia, questo non è raccomandato poiché la generazione di UTC dall'ora locale richiede solo uno scostamento di fuso orario.
Se l'orologio viene impostato indietro, o se potrebbe essere stato impostato indietro (ad esempio, mentre il sistema era spento), e il generatore di UUID non può essere sicuro che nessun UUID sia stato generato con timestamp maggiori del valore a cui l'orologio è stato impostato, allora la sequenza dell'orologio DEVE (MUST) essere modificata. Se il valore precedente della sequenza dell'orologio è noto, PUÒ (MAY) essere incrementato; altrimenti DOVREBBE (SHOULD) essere impostato su un valore casuale o pseudo-casuale di alta qualità.
Allo stesso modo, se l'ID del nodo cambia (ad esempio, perché una scheda di rete è stata spostata tra macchine), impostare la sequenza dell'orologio su un numero casuale minimizza la probabilità di un duplicato dovuto a lievi differenze nelle impostazioni dell'orologio delle macchine. Se il valore della sequenza dell'orologio associato all'ID del nodo modificato fosse noto, allora la sequenza dell'orologio PUÒ (MAY) essere incrementata, ma questo è improbabile.
La sequenza dell'orologio DEVE (MUST) essere originalmente (cioè, una volta nella vita di un sistema) inizializzata a un numero casuale per minimizzare la correlazione tra i sistemi. Questo fornisce la massima protezione contro gli ID dei nodi che possono spostarsi o passare rapidamente da un sistema all'altro.