Gli UUID spiegati: v4, v7 e come scegliere la versione giusta
Un UUID è un identificatore a 128 bit che qualsiasi computer può creare da solo, senza un contatore centrale, con la certezza pratica che nessun altro ne abbia creato uno identico. Per questo finisce per essere usato come chiave di database, nome di file, ID di richiesta o numero d’ordine. La maggior parte degli UUID che vedi è di versione 4, cioè pura casualità; la versione 7, standardizzata nel 2024, aggiunge il momento della creazione e sta rapidamente diventando la scelta migliore per i database. Questa guida spiega come leggerne uno, in cosa differiscono le versioni, quanto è davvero probabile una collisione e quale scegliere.
Com’è fatto un UUID
Un UUID è lungo 128 bit e si scrive come 32 cifre esadecimali divise in cinque gruppi separati da trattini — 8, 4, 4, 4 e 12 cifre, 36 caratteri in tutto:
3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90Un UUID di versione 4.01a0d86f-ca00-7b3e-9f21-6c4d8a0e5b17Un UUID di versione 7.
Lo standard attuale è la RFC 9562, pubblicata nel maggio 2024, che ha sostituito la RFC 4122 del 2005. Le lettere si possono scrivere in maiuscolo, in minuscolo o mescolando le due forme: in tutti e tre i casi il valore è lo stesso.
I database con un tipo UUID nativo, come PostgreSQL, memorizzano il valore in 16 byte anziché come 36 caratteri di testo.
Come leggere la versione
Due cifre indicano che tipo di UUID hai davanti. La prima cifra del terzo gruppo è la versione. La prima cifra del quarto gruppo è la variante: in ogni UUID conforme allo standard è 8, 9, a o b.
| UUID | Versione | Che cos’è |
|---|---|---|
3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90 | 4 | Casuale |
01a0d86f-ca00-7b3e-9f21-6c4d8a0e5b17 | 7 | Ordinato per tempo, creato il 25 settembre 2026 alle 12:00:00 UTC |
00000000-0000-0000-0000-000000000000 | — | Il Nil UUID: tutti i bit a zero, usato per indicare «nessun valore» |
ffffffff-ffff-ffff-ffff-ffffffffffff | — | Il Max UUID: tutti i bit a uno, usato come limite superiore |
Le versioni
| Versione | Come viene generato | Uso oggi |
|---|---|---|
| 1 | Timestamp e indirizzo di rete (MAC) del computer | Superata: rivela quale macchina ha generato l’UUID |
| 3 | Hash MD5 di un namespace e di un nome | Solo per riprodurre ID esistenti; meglio la versione 5 |
| 4 | 122 bit casuali | La scelta predefinita quasi ovunque |
| 5 | Hash SHA-1 di un namespace e di un nome | Lo stesso nome dà sempre lo stesso UUID |
| 6 | La versione 1 riorganizzata in modo da ordinarsi per tempo | Solo dove la versione 1 è già in uso |
| 7 | Timestamp Unix in millisecondi più bit casuali | Nuovi database e tutto ciò che trae vantaggio dall’ordine temporale |
| 8 | Struttura definita dall’applicazione | Formati sperimentali o specifici di un produttore |
La versione 2 esiste per un vecchio sistema di sicurezza ed è fuori dall’ambito dello standard. La RFC 9562 afferma che, dove possibile, le implementazioni dovrebbero usare la versione 7 al posto delle versioni 1 e 6.
Versione 4: casuale
Un UUID di versione 4 fissa 6 dei suoi 128 bit per indicare versione e variante, e riempie gli altri 122 con dati casuali. Lo standard chiede un generatore di numeri casuali crittograficamente sicuro, ed è proprio ciò che i browser offrono con crypto.randomUUID() — la funzione usata dal generatore di nTools.
Con 122 bit casuali, le collisioni non sono un problema pratico. La probabilità che due UUID qualsiasi coincidano raggiunge il 50% solo dopo circa 2,7 × 10¹⁸ UUID — a un miliardo al secondo, servirebbero circa 86 anni. Dopo mille miliardi di UUID, la probabilità che due di essi siano uguali è di circa 1 su 10.000 miliardi. Il rischio reale è un generatore di numeri casuali difettoso, non la matematica.
Versione 7: ordinata per tempo
Un UUID di versione 7 mette nei primi 48 bit il tempo Unix in millisecondi, poi la versione e la variante, poi 74 bit di casualità o un contatore. Poiché il tempo viene per primo, gli UUID creati più tardi si ordinano dopo quelli precedenti, sia come testo sia come byte.
Nell’esempio qui sopra, le prime 12 cifre esadecimali, 01a0d86fca00, corrispondono a 1.790.337.600.000 millisecondi dopo il 1° gennaio 1970: il 25 settembre 2026 alle 12:00:00 UTC. Il timestamp a 48 bit basta fino all’anno 10889. All’interno dello stesso millisecondo, i generatori usano bit casuali oppure aggiungono un contatore, in modo che gli UUID dello stesso processo escano comunque in ordine.
Il supporto sta arrivando negli strumenti di uso comune: PostgreSQL 18, rilasciato a settembre 2025, ha aggiunto una funzione integrata uuidv7() accanto a uuidv4().
Quale usare come chiave di un database
La maggior parte dei database conserva le chiavi primarie in un indice B-tree, che resta efficiente quando le nuove chiavi arrivano in ordine.
- Le chiavi di versione 4 finiscono in punti casuali dell’indice. Sulle tabelle piccole non ha importanza; su quelle grandi ogni inserimento tocca una parte diversa dell’indice, il che significa più suddivisioni di pagina, più cache miss e indici più grandi.
- Le chiavi di versione 7 arrivano in ordine di tempo, quindi le nuove righe vengono aggiunte vicino alla fine dell’indice, più o meno come con un numero autoincrementale — pur potendo essere create ovunque, senza chiedere al database il valore successivo.
- Gli interi autoincrementali sono più piccoli e più veloci, ma richiedono un unico contatore centrale e rivelano quanti record esistono e in quale ordine sono stati creati.
Per una nuova tabella che ha bisogno di UUID, di solito la versione 7 è la scelta migliore. La versione 4 resta quella giusta quando il momento della creazione non deve essere ricavabile dall’ID.
Cosa non è un UUID
- Non è un segreto. Un UUID di versione 7 mostra a chiunque lo legga quando è stato creato, al millisecondo. Un UUID di versione 4 è difficile da indovinare, ma gli ID finiscono nei log, vengono condivisi negli URL e mostrati nelle interfacce. I link per reimpostare una password o per accedere a file privati dovrebbero usare un token casuale dedicato, non l’ID del record.
- Non è una fonte di informazioni. Lo standard raccomanda di trattare gli UUID come valori opachi: memorizzarli e confrontarli, ma senza costruire una logica che dipenda dalla lettura delle loro parti.
- Non è sempre di versione 4. Il codice che si aspetta casualità non dovrebbe darla per scontata; quando conta, controlla la cifra della versione.
Domande frequenti
Due UUID casuali possono mai essere uguali?
In teoria sì; in pratica no. Servirebbero circa 2,7 × 10¹⁸ UUID di versione 4 per avere il 50% di probabilità di una sola coincidenza, a patto che provengano da un generatore di numeri casuali adeguato.
Un GUID è la stessa cosa di un UUID?
Sì. GUID è il nome usato da Microsoft per lo stesso identificatore a 128 bit. Gli strumenti di Windows lo mostrano spesso in maiuscolo o racchiuso tra parentesi graffe, come {3F2A9C1E-5B7D-4E8A-9C21-7D4E5F6A8B90}, ma il valore è lo stesso.
Gli UUID distinguono tra maiuscole e minuscole?
No. 3F2A9C1E-… e 3f2a9c1e-… sono lo stesso UUID. Confrontali senza distinguere tra maiuscole e minuscole, oppure memorizzali in una colonna UUID nativa, che elimina il problema.
Quale versione crea il generatore di nTools?
La versione 4, tramite la funzione crypto.randomUUID() del browser. Ne crea fino a 100 alla volta, interamente sul tuo dispositivo.
Guide correlate
- Indirizzi IP spiegati: IPv4, IPv6 e gli intervalli riservati
- Record DNS spiegati: A, AAAA, CNAME, MX, TXT e NS
- Sottoreti e CIDR spiegati: prefissi, maschere e host utilizzabili
- Timestamp Unix e fusi orari spiegati
- Formati immagine spiegati: JPEG, PNG, WebP, AVIF e HEIC
- Robustezza delle password spiegata: lunghezza, entropia e passphrase
- I codici QR spiegati: capacità, correzione degli errori e dimensioni di stampa
- Percentuali e IVA spiegate: aggiungere, scorporare e cumulare