Passa al contenuto principale

4. Specifica (Specification)

4.1. Formato (Format)

Il formato UUID è di 16 ottetti; alcuni bit del campo variante di otto ottetti specificato di seguito determinano una struttura più fine.

4.1.1. Variante (Variant)

Il campo variante determina il layout dell'UUID. Cioè, l'interpretazione di tutti gli altri bit nell'UUID dipende dall'impostazione dei bit nel campo variante. Il campo variante consiste in un numero variabile dei bit più significativi dell'ottetto 8 dell'UUID.

La seguente tabella elenca il contenuto del campo variante, dove la lettera "x" indica un valore "indifferente".

Msb0Msb1Msb2Descrizione (Description)
0xxRiservato, compatibilità retroattiva NCS
10xLa variante specificata in questo documento
110Riservato, compatibilità retroattiva Microsoft Corporation
111Riservato per definizione futura

4.1.2. Layout e ordine dei byte (Layout and Byte Order)

Per minimizzare la confusione sulle assegnazioni di bit all'interno degli ottetti, la definizione del record UUID è definita solo in termini di campi che sono numeri interi di ottetti. I campi sono presentati con il più significativo per primo.

CampoTipo di datiOttetto #Nota
time_lowintero senza segno a 32 bit0-3Il campo inferiore del timestamp
time_midintero senza segno a 16 bit4-5Il campo medio del timestamp
time_hi_and_versionintero senza segno a 16 bit6-7Il campo superiore del timestamp multiplexato con il numero di versione
clock_seq_hi_and_reservedintero senza segno a 8 bit8Il campo superiore della sequenza di clock multiplexata con la variante
clock_seq_lowintero senza segno a 8 bit9Il campo inferiore della sequenza di clock
nodeintero senza segno a 48 bit10-15L'identificatore di nodo spazialmente unico

Struttura UUID (128 bit):

 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. Versione (Version)

Il numero di versione si trova nei 4 bit più significativi del timestamp (bit da 4 a 7 del campo time_hi_and_version).

La seguente tabella elenca le versioni attualmente definite per questa variante UUID:

Msb0-3VersioneDescrizione
00011La versione basata sul tempo specificata in questo documento
00102Versione di sicurezza DCE, con UID POSIX incorporati
00113La versione basata sul nome specificata in questo documento che utilizza l'hashing MD5
01004La versione generata casualmente o pseudo-casualmente specificata in questo documento
01015La versione basata sul nome specificata in questo documento che utilizza l'hashing SHA-1

4.1.4. Timestamp

Il timestamp è un valore a 60 bit. Per l'UUID versione 1, questo è rappresentato dal Tempo Universale Coordinato (UTC) come conteggio di intervalli di 100 nanosecondi dal 15 ottobre 1582 alle 00:00:00.00 (la data della riforma gregoriana del calendario cristiano).

Per l'UUID versione 3 o 5, il timestamp è un valore a 60 bit costruito da un nome come descritto nella Sezione 4.3.

Per l'UUID versione 4, il timestamp è un valore a 60 bit generato casualmente o pseudo-casualmente, come descritto nella Sezione 4.4.

4.1.5. Sequenza di clock (Clock Sequence)

Per l'UUID versione 1, la sequenza di clock viene utilizzata per evitare duplicati che potrebbero sorgere quando il clock viene impostato indietro nel tempo o se l'ID del nodo cambia.

La sequenza di clock deve (MUST) essere originariamente (cioè, una volta nella vita di un sistema) inizializzata su un numero casuale per minimizzare la correlazione tra i sistemi.

Per l'UUID versione 3 o 5, la sequenza di clock è un valore a 14 bit costruito da un nome come descritto nella Sezione 4.3.

Per l'UUID versione 4, la sequenza di clock è un valore a 14 bit generato casualmente o pseudo-casualmente.

4.1.6. Nodo (Node)

Per l'UUID versione 1, il campo node consiste in un indirizzo MAC IEEE 802, solitamente l'indirizzo dell'host. Per i sistemi con più indirizzi IEEE 802, può essere utilizzato qualsiasi indirizzo disponibile.

Per l'UUID versione 3 o 5, il campo node è un valore a 48 bit costruito da un nome come descritto nella Sezione 4.3.

Per l'UUID versione 4, il campo node è un valore a 48 bit generato casualmente o pseudo-casualmente.

4.1.7. UUID nullo (Nil UUID)

L'UUID nullo è una forma speciale di UUID che è specificata per avere tutti i 128 bit impostati a zero:

00000000-0000-0000-0000-000000000000

4.2. Algoritmi per la creazione di un UUID basato sul tempo (Algorithms for Creating a Time-Based UUID)

4.2.1. Algoritmo di base (Basic Algorithm)

L'algoritmo di base per generare un UUID basato sul tempo:

  1. Ottenere un blocco globale a livello di sistema
  2. Leggere l'ora corrente
  3. Ottenere l'ID del nodo corrente
  4. Se l'ID del nodo è cambiato dall'ultima generazione di UUID, impostare la sequenza di clock su un valore casuale
  5. Se l'ora corrente è precedente all'ultimo timestamp, incrementare la sequenza di clock
  6. Salvare il timestamp e l'ID del nodo
  7. Rilasciare il blocco globale
  8. Formattare l'UUID utilizzando il timestamp, la sequenza di clock e l'ID del nodo

4.2.2. Dettagli di generazione (Generation Details)

Timestamp: Il timestamp è un valore a 60 bit costruito dall'ora di sistema. La risoluzione del timestamp è di 100 nanosecondi.

Sequenza di clock: La sequenza di clock è inizialmente impostata su un valore casuale. Viene incrementata ogni volta che il clock si sposta all'indietro o l'ID del nodo cambia.

ID del nodo: L'ID del nodo è tipicamente un indirizzo MAC IEEE 802.

4.3. Algoritmo per la creazione di un UUID basato sul nome (Algorithm for Creating a Name-Based UUID)

L'algoritmo per creare un UUID basato sul nome (versione 3 o versione 5):

  1. Allocare un UUID da utilizzare come "ID dello spazio dei nomi" per tutti gli UUID generati dai nomi in quello spazio dei nomi
  2. Scegliere MD5 (versione 3) o SHA-1 (versione 5) come algoritmo di hash
  3. Convertire il nome in una sequenza canonica di ottetti
  4. Calcolare l'hash dell'ID dello spazio dei nomi concatenato con il nome
  5. Impostare gli ottetti da zero a quindici sugli ottetti da zero a quindici dell'hash
  6. Impostare i quattro bit più significativi (bit da 12 a 15) dell'ottetto 6 sul numero di versione appropriato
  7. Impostare i due bit più significativi (bit 6 e 7) dell'ottetto 8 rispettivamente su zero e uno

4.4. Algoritmi per la creazione di un UUID da numeri veramente casuali o pseudo-casuali (Algorithms for Creating a UUID from Truly Random or Pseudo-Random Numbers)

L'UUID versione 4 è destinato alla generazione di UUID da numeri veramente casuali o pseudo-casuali.

L'algoritmo è il seguente:

  1. Impostare tutti i bit su valori scelti casualmente (o pseudo-casualmente)
  2. Impostare i quattro bit più significativi (bit da 12 a 15) dell'ottetto 6 sul numero di versione a 4 bit (0100 binario)
  3. Impostare i due bit più significativi (bit 6 e 7) dell'ottetto 8 rispettivamente su zero e uno

4.5. ID di nodo che non identificano l'host (Node IDs that Do Not Identify the Host)

Questa sezione descrive alternative per generare ID di nodo che non identificano l'host:

  1. ID di nodo casuale: Impostare il bit meno significativo del primo ottetto dell'ID del nodo su uno (bit multicast). Questo contrassegna l'UUID come non basato su un indirizzo MAC reale.

  2. ID di nodo casuale persistente: Generare un ID di nodo casuale una volta e memorizzarlo per il riutilizzo. Questo fornisce coerenza tra i riavvii mantenendo la privacy.


Nota: Per esempi di implementazione dettagliati e algoritmi completi, si prega di fare riferimento alla specifica ufficiale RFC 4122 e all'Appendice A.