Cos'è un UUID?
Un UUID (Universally Unique Identifier) è un identificatore a 128 bit progettato per essere unico nello spazio e nel tempo, senza coordinazione centrale. Il risultato è una stringa di 36 caratteri nel formato:
550e8400-e29b-41d4-a716-446655440000
Codifica 32 cifre esadecimali in cinque gruppi separati da trattini: 8-4-4-4-12.
Versioni di UUID
UUID v1 — Basato sul tempo + MAC
Combina il timestamp con l'indirizzo MAC. Ordinato cronologicamente ma rivela l'indirizzo MAC e il timestamp esatto — problema di privacy.
UUID v4 — Casuale (il più usato)
Riempie 122 bit con dati casuali crittograficamente sicuri. La scelta predefinita per la maggior parte dei casi.
UUID v5 — Namespace + SHA-1
Deterministico: stesso namespace + nome = stesso UUID sempre. Preferisci v5 a v3 (MD5 è obsoleto).
UUID v7 — Ordinato per tempo (nuovo standard)
Usa un timestamp Unix in millisecondi nei bit più significativi. UUID ordinabili che migliorano significativamente le prestazioni degli indici B-tree.
Perché Usare gli UUID?
- Nessuna coordinazione centrale: Qualsiasi client o microservizio può generare un UUID indipendentemente.
- Sicurezza per opacità: Gli ID interi sequenziali espongono il volume dei dati. Gli UUID non rivelano nulla.
- Fusione di database: Le tabelle con chiavi UUID si uniscono senza conflitti.
- Generazione offline: Le app mobili possono creare record offline e sincronizzare in seguito.
- Standard di settore: Supporto nativo in tutti i principali database e framework.
Quando NON Usare gli UUID?
- Overhead di archiviazione: Usa
BINARY(16)in MySQL o il tipo nativouuidin PostgreSQL invece diVARCHAR(36). - Slug URL: Troppo lunghi e non memorabili. Usa slug leggibili per URL rivolti agli utenti.
- Frammentazione indici con v4: Per tabelle ad alto volume di scrittura usa UUID v7 o ULID.
VARCHAR(36). Usa BINARY(16) con UUID_TO_BIN(uuid, 1).
Generare UUID nel Codice
JavaScript
const id = crypto.randomUUID(); // v4
Python
import uuid; id = str(uuid.uuid4())
PHP
use Ramsey\Uuid\Uuid;
$v4 = Uuid::uuid4()->toString();
$v7 = Uuid::uuid7()->toString();
SQL
-- MySQL: SELECT UUID();
-- PostgreSQL: SELECT gen_random_uuid();
Best Practice
- Archivia come binary:
BINARY(16)o tipo nativouuidPostgreSQL. - Usa v4 per la maggior parte dei casi.
- Usa v7 per le chiavi primarie del database.
- Evita v1 nei contesti sensibili alla privacy.
- Valida il formato UUID in input.
- Usa sempre lettere minuscole.
Domande Frequenti
Due UUID possono essere uguali?
Teoricamente sì. La probabilità di collisione v4 è circa 1 su 5,3×1036. In pratica non incontrerai mai una collisione in nessun sistema reale.
v4 o v7 per le chiavi primarie?
v7 per le chiavi primarie. v4 inserisce in posizioni casuali nell'indice B-tree. v7 garantisce inserzioni alla fine dell'indice.
Gli UUID sono sensibili alle maiuscole?
No. La specifica è case-insensitive. Per convenzione usa sempre le minuscole.