Decodificatore UUID

Decodifica e ispeziona la struttura, la versione e i dati incorporati degli UUID

Prova un esempio

Input UUID

Incolla un UUID sopra per ispezionarlo

Struttura UUID

Un UUID (Universally Unique Identifier) è un valore a 128 bit rappresentato come 32 cifre esadecimali divise in cinque gruppi da trattini:

Formato
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
xxxxxxxx (8)8 cifre esadecimali — 32 bit
xxxx (4)4 cifre esadecimali — 16 bit
Mxxx (4)4 cifre esadecimali — 16 bit. La prima cifra M codifica la versione UUID (1-8).
Nxxx (4)4 cifre esadecimali — 16 bit. La prima cifra N codifica la variante UUID (RFC 4122, NCS, Microsoft o riservato).
xxxxxxxxxxxx (12)12 cifre esadecimali — 48 bit

La versione e la variante sono i soli due campi garantiti di essere presenti in ogni UUID. Tutti gli altri campi dipendono dalla versione.

Il campo versione

Il nibble di versione è la prima cifra esadecimale del terzo gruppo (posizione 14 nella stringa completa). Identifica la versione UUID usata per generare l'identificatore.

JavaScript
const hex = uuid.replace(/-/g, '')
const version = parseInt(hex[12], 16)  // single hex digit → 1, 2, 3, 4, 5, 6, 7, or 8

La versione 7 (UUID v7) è la versione più recente ampiamente usata, introdotta in RFC 9562 (2024). Codifica un timestamp Unix in millisecondi nei bit più significativi per l'ordinabilità.

Il campo variante

La variante è codificata nei bit più significativi del primo byte del quarto gruppo. Identifica le convenzioni di layout e di ordinamento dei byte usate dall'UUID.

Bit più significativiIntervallo prima cifra esadecimaleVarianteDescrizione
0xxx xxxx0x00–0x7FCompatibilità precedente NCSUUID NCS (Network Computing System) legacy. Riservato per compatibilità precedente.
10xx xxxx0x80–0xBFRFC 4122 / RFC 9562La variante UUID standard RFC 4122 / RFC 9562. Usata da tutte le versioni UUID moderne (v1-v8).
110x xxxx0xC0–0xDFCompatibilità precedente MicrosoftGUID Microsoft COM/DCOM legacy con un diverso ordinamento dei byte. Ancora incontrato nei componenti COM Windows.
111x xxxx0xE0–0xFFRiservatoRiservato per definizione futura. Non usato da nessuna versione UUID attuale.

In pratica, quasi tutti gli UUID che si incontrano utilizzano la variante RFC 4122 / RFC 9562 (schema di bit 10xx xxxx, primo byte del quarto gruppo nell'intervallo 0x80–0xBF). Le varianti NCS, Microsoft COM e Reserved sono formati legacy raramente presenti nei sistemi moderni.

Riferimento versioni UUID

RFC 4122 ha definito le versioni 1-5. RFC 9562 (2024) ha aggiunto le versioni 6, 7 e 8:

VersioneNomeStandardDescrizione
v1Basato sul tempoRFC 4122Timestamp (epoch gregoriano, precisione 100ns) + indirizzo MAC. Sequenziale per host ma divulga l'identità dell'host.
v2Sicurezza DCERFC 4122Basato su UUID v1 con il campo time_low sostituito da un UID/GID POSIX. Raramente usato al di fuori dei sistemi DCE/RPC legacy.
v3Basato su nome MD5RFC 4122Deterministico: hash MD5 di un UUID namespace + stringa nome. Gli stessi input producono sempre lo stesso UUID. Preferire v5.
v4CasualeRFC 4122122 bit di casualità crittograficamente sicura. La versione UUID più comune per uso generico.
v5Basato su nome SHA-1RFC 4122Come v3 ma usa SHA-1. Più resistente alle collisioni di MD5. Preferito a v3 per i nuovi UUID basati su nome.
v6Tempo riordinatoRFC 9562Riordina i campi timestamp di UUID v1 in modo che l'UUID sia ordinabile cronologicamente. Definito in RFC 9562.
v7Tempo UnixRFC 9562Timestamp Unix a 48 bit in millisecondi nei bit più significativi + dati casuali. Ordinabile e compatibile con gli indici B-tree. Preferito per i nuovi ID ordinati nel tempo.
v8PersonalizzatoRFC 9562Forma libera: tutti i bit tranne versione e variante sono definiti dall'applicazione. Nessun algoritmo di generazione è specificato.

Decodifica dei timestamp UUID v1

UUID v1 incorpora un timestamp gregoriano a 60 bit (intervalli di 100 nanosecondi dal 15 ottobre 1582) suddiviso su tre campi: time_low (bit 0-31), time_mid (bit 32-47) e time_hi (bit 48-59). Questo strumento li riassembla e li converte in una data UTC standard.

JavaScript
// UUID v1: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
//           ^^^^^^^^ ^^^^ ^^^^ ^^^^^ ^^^^^^^^^^^^
//           time-low  mid  hi  clk   node (MAC)
//                          ^
//                          version nibble (1)

const hex = '6ba7b8109dad11d180b400c04fd430c8'

const tLow = parseInt(hex.slice(0, 8),  16)  // 0x6ba7b810
const tMid = parseInt(hex.slice(8, 12), 16)  // 0x9dad
const tHi  = parseInt(hex.slice(13, 16), 16) // 0x1d1 (skip version nibble at index 12)

// Reconstruct 60-bit timestamp (100-ns intervals since Oct 15, 1582)
const t = (BigInt(tHi) << 48n) | (BigInt(tMid) << 32n) | BigInt(tLow)

// Subtract Gregorian offset (Oct 15, 1582 → Jan 1, 1970 in 100-ns units)
const GREGORIAN_OFFSET = 122192928000000000n
const unixMs = (t - GREGORIAN_OFFSET) / 10000n

console.log(new Date(Number(unixMs)).toISOString())
// → 1998-02-04T22:13:53.578Z
Note:Il campo della sequenza di clock (14 bit) previene i duplicati quando il clock va indietro. Il campo node (48 bit) è tipicamente l'indirizzo MAC dell'host generatore.

UUID v1 dovrebbe essere trattato come sensibile: l'indirizzo MAC incorporato e il timestamp preciso possono identificare sia la macchina generatrice che il tempo di generazione.

Decodifica dei timestamp UUID v7

UUID v7 incorpora un timestamp Unix a 48 bit in millisecondi nei primi 48 bit (primo gruppo + prime 4 cifre del secondo gruppo). Questo strumento legge quei bit e li converte in una data UTC con precisione in millisecondi.

JavaScript
// UUID v7: 018e4bc8-1000-7000-8000-000000000001
//           ^^^^^^^^^^^^
//           48-bit Unix ms timestamp

const hex = '018e4bc8100070008000000000000001'

// First 48 bits (12 hex chars) = Unix timestamp in milliseconds
const ms = parseInt(hex.slice(0, 12), 16)  // 0x018e4bc81000

console.log(new Date(ms).toISOString())
// → 2024-03-11T…Z

// Everything after byte 6 is random (except version/variant bits)

A differenza di UUID v1, il timestamp UUID v7 usa l'epoch Unix familiare (1 gennaio 1970) e non incorpora nessuna informazione sull'host. I 74 bit rimanenti sono casuali.

Come questo strumento rileva la versione e la variante UUID

Il decoder legge la posizione 14 (nibble di versione) e la posizione 19 (nibble di variante) della stringa UUID canonica. Non è necessario nessuno stato esterno o contesto — tutte le informazioni sono contenute nella stringa UUID.

JavaScript
// Detect UUID version from the 13th hex character (index 12)
function uuidVersion(uuid) {
  const clean = uuid.replace(/-/g, '')
  return parseInt(clean[12], 16)
}

uuidVersion('550e8400-e29b-41d4-a716-446655440000') // → 4
uuidVersion('018e4bc8-1000-7000-8000-000000000001') // → 7
uuidVersion('6ba7b810-9dad-11d1-80b4-00c04fd430c8') // → 1

// Detect variant from the 17th hex character (index 16, first char of 4th group)
function uuidVariant(uuid) {
  const clean = uuid.replace(/-/g, '')
  const b = parseInt(clean[16], 16)
  if ((b & 0x8) === 0)      return 'NCS'
  if ((b & 0xC) === 0x8)    return 'RFC 4122'
  if ((b & 0xE) === 0xC)    return 'Microsoft'
  return 'Reserved'
}

UUID speciali

UUID nil

L'UUID nil 00000000-0000-0000-0000-000000000000 è tutto zeri. È definito da RFC 4122 come valore sentinella che significa 'nessun UUID' — analogo a null. Non è un UUID generato valido.

UUID max

L'UUID max ffffffff-ffff-ffff-ffff-ffffffffffff è tutto uni (0xFF in ogni byte). Definito in RFC 9562, è il complemento dell'UUID nil e serve come valore sentinella massimo.

Domande Frequenti

Come si capisce quale versione è un UUID?
Guardare la posizione 14 nella stringa UUID canonica (il primo carattere del terzo gruppo separato da trattini). Quella singola cifra esadecimale è il numero di versione: 1, 2, 3, 4, 5, 6, 7 o 8. Incollare l'UUID in questo strumento e decodificherà la versione.
Posso decodificare un UUID per recuperare i dati originali?
Dipende dalla versione. UUID v1 e v7 incorporano un timestamp che può essere completamente recuperato. UUID v1 incorpora anche l'indirizzo MAC. UUID v3 e v5 sono hash unidirezionali — non è possibile recuperare il nome originale dall'UUID. UUID v4 è puramente casuale — non c'è nulla da recuperare.
Cosa significa 'variante' in un UUID?
Il campo variante identifica il layout dei byte e la convenzione di interpretazione dell'UUID. Quasi tutti gli UUID incontrati avranno la variante RFC 4122 (bit più significativi 10), codificata come cifre esadecimali 8, 9, a o b in posizione 19. Le altre varianti (NCS, Microsoft) sono formati legacy degli anni '90.
Perché alcuni UUID sembrano diversi dagli altri?
La differenza visiva è nel nibble di versione (posizione 14) e nel nibble di variante (posizione 19). Per esempio, UUID v4 ha sempre un 4 in posizione 14, mentre UUID v7 ha sempre un 7. All'interno di questi vincoli, le cifre rimanenti sono casuali o derivate da timestamp a seconda della versione.
L'UUID nil è uguale a un UUID vuoto?
Concettualmente sì — l'UUID nil (tutti zeri) è usato per rappresentare l'assenza di un UUID, simile a null. Non è un UUID generato casualmente e non dovrebbe essere memorizzato come identificatore reale. Alcuni sistemi lo usano come valore predefinito o segnaposto.
Un UUID può essere non valido?
Un UUID può essere sintatticamente valido (formato corretto) ma semanticamente insolito — per esempio, avendo un nibble di versione di 0 o una variante di 11x (riservato). L'UUID nil e l'UUID max sono sintatticamente validi ma sono valori sentinella. Questo strumento mostrerà qualsiasi nibble di versione e variante presente e segnalerà le versioni non riconosciute.
Qual è la differenza tra un UUID e un GUID?
GUID (Globally Unique Identifier) è il nome di Microsoft per lo stesso concetto. I GUID seguono lo stesso formato RFC 4122 a 128 bit. L'unica differenza pratica è che i GUID Microsoft legacy possono usare la variante Microsoft (bit più significativi 110) piuttosto che la variante RFC 4122 — questo influisce sull'ordinamento dei byte nella rappresentazione binaria. La rappresentazione testuale è identica.