UUID v4 vs v7: quale identificatore univoco scegliere?
Un UUID è un identificatore di 128 bit univoco senza coordinamento centrale. La versione 4, interamente casuale, domina da anni. La versione 7, più recente (RFC 9562, 2024), integra un timestamp in testa per produrre identificatori ordinati nel tempo. Questa differenza, apparentemente innocua, cambia radicalmente le prestazioni nel database. Ecco quale scegliere.
Cos'è un UUID?
Un UUID (Universally Unique Identifier) è un numero di 128 bit rappresentato da 32 caratteri esadecimali raggruppati in cinque blocchi, ad esempio 550e8400-e29b-41d4-a716-446655440000. La sua ragion d'essere: generare un identificatore univoco senza chiedere a un'autorità centrale, il che lo rende ideale per i sistemi distribuiti. Puoi generarne con il nostro generatore di UUID.
Esistono diverse versioni; le più pertinenti oggi per le chiavi di record sono la v4 (casuale) e la v7 (ordinata nel tempo).
UUID v4 (casuale)
L'UUID v4 è costituito da 122 bit casuali (il resto codifica la versione e il variant). La probabilità di collisione è così bassa da essere trascurabile in pratica. È la versione predefinita nella maggior parte dei linguaggi e delle librerie.
- Imprevedibile: perfetto per token o identificatori pubblici che non si vogliono indovinabili
- Nessuna fuga di informazioni: non rivela né data né ordine di creazione
- Svantaggio: completamente disordinato, il che penalizza gli indici di database
UUID v7 (ordinato nel tempo)
L'UUID v7 colloca un timestamp Unix in millisecondi sui suoi primi 48 bit, seguito da bit casuali. Due UUID v7 generati in istanti diversi si ordinano quindi nell'ordine della loro creazione, pur restando univoci e praticamente impossibili da indovinare.
- Ordinabile: l'ordine lessicografico corrisponde all'ordine cronologico
- Amico degli indici: gli inserimenti avvengono in fondo all'indice, come un auto-incremento
- Contropartita: rivela l'istante di creazione, il che può essere indesiderato per un identificatore pubblico
Tabella comparativa
| Criterio | UUID v4 | UUID v7 |
|---|---|---|
| Composizione | 122 bit casuali | Timestamp + casuale |
| Ordinato nel tempo | No | Sì |
| Ordinabile | No | Sì (cronologico) |
| Prestazioni dell'indice | Basse (frammentazione) | Elevate (inserimenti sequenziali) |
| Imprevedibilità | Totale | Elevata ma rivela l'istante |
| Fuga di informazioni | Nessuna | Data di creazione |
| Maturità / supporto | Universale | Recente (RFC 9562, 2024) |
Impatto sui database
È il cuore della questione. I database relazionali memorizzano i loro indici in alberi B (B-tree). Inserire chiavi casuali (v4) disperde le scritture ovunque nell'indice, provocando frammentazione, suddivisioni di pagina e una cache meno efficiente. Su grandi volumi, le prestazioni di inserimento si degradano nettamente.
Le chiavi ordinate (v7) si inseriscono sempre alla fine dell'indice, come un identificatore auto-incrementato. Si ritrovano inserimenti rapidi, una migliore località e un indice più compatto. Questo è particolarmente evidente con una chiave primaria in InnoDB (MySQL), dove la chiave primaria determina l'ordine fisico delle righe.
Quando scegliere l'uno o l'altro
Scegliere UUID v4 quando
- L'identificatore è esposto pubblicamente e non deve rivelare nulla
- Generi token, link di condivisione, segreti
- L'ordine e la data di creazione non devono essere indovinabili
- Vuoi la massima compatibilità con l'esistente
Scegliere UUID v7 quando
- L'UUID funge da chiave primaria in un database
- Il volume di inserimenti è elevato e le prestazioni dell'indice contano
- Vuoi ordinare per ordine di creazione senza una colonna dedicata
- Rivelare l'istante di creazione non è un problema
Raccomandazione
Per una chiave primaria di database, preferisci ormai UUID v7: mantieni l'unicità distribuita dell'UUID evitando al contempo la penalità di indice della v4. Conserva UUID v4 per gli identificatori pubblici, i token e i segreti, dove l'imprevedibilità totale e l'assenza di fuga temporale hanno la priorità.
Verifica comunque il supporto della v7 nel tuo linguaggio e nel tuo ORM: la RFC è recente, ma l'adozione progredisce in fretta.
Domande frequenti
UUID v7 è meno sicuro di v4?
Resta molto difficile da indovinare grazie ai suoi bit casuali, ma rivela l'istante di creazione tramite il suo timestamp. Per un identificatore pubblico in cui la data non deve trapelare, o per un segreto, preferisci la v4.
Perché l'UUID v4 rallenta i database?
Perché i suoi valori casuali disperdono gli inserimenti in tutto l'indice B-tree, il che frammenta le pagine e riduce l'efficienza della cache. La v7, ordinata, inserisce alla fine dell'indice ed evita questo problema.
Posso migrare da v4 a v7?
Sì per i nuovi record: i due formati coesistono nella stessa colonna UUID. Inutile riscrivere lo storico; basta passare la generazione delle nuove chiavi alla v7.
E le versioni v1 e v6?
La v1 codifica il timestamp e l'indirizzo MAC, il che pone problemi di riservatezza. La v6 riordina la v1 per renderla ordinabile. Per un nuovo progetto, la v7 è la versione ordinata raccomandata dalla RFC 9562.