Guida UUID: Versioni, Formati e Best Practice
Gli UUID (Universally Unique Identifier) sono identificatori a 128 bit progettati per essere univoci nello spazio e nel tempo senza un'autorità centrale. Sono la scelta standard per i sistemi distribuiti dove è essenziale generare ID in modo indipendente — senza coordinamento.
Formato UUID
Un UUID è un numero a 128 bit visualizzato come 32 cifre esadecimali in cinque gruppi separati da trattini:
550e8400-e29b-41d4-a716-446655440000
^^^^^^^^ ^^^^ ^^^^ ^^^^ ^^^^^^^^^^^^
time-low mid hi clk node
+ver +var
- Totale: 128 bit (16 byte)
- Lunghezza stringa: 36 caratteri (32 esadecimali + 4 trattini)
- Versione: Codificata nel 13° carattere (il nibble "hi")
- Variante: Codificata nel 17° carattere
Genera UUID istantaneamente con il nostro Generatore UUID.
Versioni UUID
UUID v1: Basato sul Tempo
Generato dal timestamp corrente e dall'indirizzo MAC della macchina.
// Struttura: timestamp (60 bit) + sequenza clock (14 bit) + nodo (48 bit)
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Pro: Ordinabile naturalmente per tempo di creazione, univocità garantita per macchina. Contro: Espone l'indirizzo MAC (problema di privacy), può rivelare il tempo di creazione. Usa quando: Hai bisogno dell'ordinamento temporale e sei in un ambiente controllato.
UUID v4: Casuale
Generato da numeri casuali crittograficamente sicuri. Questa è la versione più ampiamente usata.
// 122 bit casuali (6 bit riservati per versione e variante)
f47ac10b-58cc-4372-a567-0e02b2c3d479
Pro: Semplice, nessuna perdita di informazioni, nessun coordinamento necessario. Contro: Non ordinabile, prestazioni di indice del database leggermente peggiori rispetto agli ID sequenziali. Usa quando: Uso generale — questa è la scelta predefinita per la maggior parte delle applicazioni.
UUID v7: Casuale Ordinato per Tempo (Nuovo Standard)
La versione più recente (RFC 9562, 2024), che combina un timestamp Unix con dati casuali.
// Struttura: timestamp (48 bit) + casuale (74 bit)
018e7b50-4a00-7000-8000-000000000001
Pro: Ordinato naturalmente per tempo, eccellenti prestazioni di indice del database, nessuna perdita di informazioni oltre la precisione al millisecondo. Contro: Più recente, alcune librerie potrebbero non supportarlo ancora. Usa quando: Hai bisogno di ID univoci che si ordinino cronologicamente — ideale per chiavi primarie del database.
Altre Versioni
- UUID v3: Hash MD5 di un namespace e un nome. Deterministico.
- UUID v5: Hash SHA-1 di un namespace e un nome. Deterministico e preferito rispetto a v3.
- UUID v6: v1 riordinato per una migliore ordinabilità. Superato da v7.
- UUID Nil: Tutti zeri (
00000000-0000-0000-0000-000000000000). Usato come valore sentinella.
Probabilità di Collisione
Quanto è probabile che due UUID generati casualmente (v4) collidano? Con 122 bit casuali:
- Dopo aver generato 1 miliardo di UUID: probabilità ≈ 1 su 10^18
- Per avere una probabilità del 50% di collisione: servono circa 2,7 × 10^18 UUID
- A 1 miliardo di UUID al secondo: ci vorrebbero circa 86 anni
Per tutti gli scopi pratici, le collisioni di UUID v4 non si verificheranno. È molto più probabile un guasto hardware.
UUID vs Altri Formati di ID
| Formato | Lunghezza | Ordinabile | Univoco | URL-Safe |
|---|---|---|---|---|
| UUID v4 | 36 caratteri | No | Sì | Sì |
| UUID v7 | 36 caratteri | Sì | Sì | Sì |
| ULID | 26 caratteri | Sì | Sì | Sì |
| nanoid | 21 caratteri | No | Probabilmente | Sì |
| Auto-increment | Variabile | Sì | Per-tabella | Sì |
| Snowflake ID | 18-19 caratteri | Sì | Per-sistema | Sì |
ULID (Universally Unique Lexicographically Sortable Identifier)
Gli ULID sono un'alternativa compatta: timestamp a 48 bit + 80 bit casuali, codificati come 26 caratteri Crockford Base32. Si ordinano lessicograficamente per tempo di creazione.
Quando Usare gli ID Auto-Incrementanti
Gli ID sequenziali sono più semplici ed efficienti per le applicazioni con singolo database. Usa gli UUID quando hai bisogno di:
- ID generati da più sistemi in modo indipendente
- ID che non rivelano l'ordine di inserimento agli utenti esterni
- ID compatibili con la fusione per database distribuiti
Considerazioni sulle Prestazioni del Database
Gli UUID casuali (v4) causano frammentazione dell'indice B-tree perché gli inserimenti avvengono in posizioni casuali. Questo può degradare le prestazioni di scrittura di 2-5x rispetto agli ID sequenziali su tabelle grandi.
Soluzioni:
- Usa UUID v7: Gli UUID ordinati per tempo si inseriscono sequenzialmente, eguagliando le prestazioni dell'auto-increment
- Archivia come binario: Usa
BINARY(16)invece diCHAR(36)per risparmiare il 55% di spazio - Usa ULID: Ordinabile e più compatto degli UUID
-- PostgreSQL: tipo UUID nativo (16 byte, efficiente)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL
);
-- MySQL: archivia come BINARY(16) per le prestazioni
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
Generazione di UUID
Riga di Comando
# macOS/Linux
uuidgen
# Python one-liner
python3 -c "import uuid; print(uuid.uuid4())"
JavaScript
// Built-in (Node.js 19+, browser moderni)
crypto.randomUUID();
// Per UUID v7 (usando il pacchetto uuid)
import { v7 } from 'uuid';
const id = v7();
Python
import uuid
uuid.uuid4() # Casuale
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # Basato sul nome
Per una generazione rapida senza codice, il nostro Generatore UUID crea UUID v4 istantaneamente nel tuo browser.
FAQ
Devo usare UUID o intero auto-incrementante per la chiave primaria del mio database?
Per le applicazioni con singolo database, gli interi auto-incrementanti sono più semplici e veloci. Per i sistemi distribuiti, i microservizi o quando devi generare ID lato client prima dell'inserimento nel database, gli UUID (preferibilmente v7) sono la scelta migliore. Se usi PostgreSQL, il supporto nativo UUID rende la differenza di prestazioni trascurabile.
Gli UUID possono essere usati come token di sicurezza?
UUID v4 usa 122 bit di casualità da una fonte crittografica, che fornisce buona entropia. Tuttavia, per i token di sicurezza (chiavi API, ID di sessione), è meglio usare formati di token dedicati con proprietà aggiuntive come checksum, codifica della scadenza o identificazione con prefisso. Gli UUID sono per l'identità, non per l'autenticazione.
Risorse Correlate
- Generatore UUID — Genera UUID istantaneamente online
- Algoritmi Hash a Confronto — Comprendere le funzioni hash dietro UUID v3 e v5
- Pattern di Progettazione API JSON — Usare gli UUID efficacemente nelle risposte API