Perché gli ID Unici Sono Più Difficili di Quanto Sembrano
Hai bisogno di un identificatore unico per una riga di database, una risorsa API, un token di sessione. Facile, no? Basta usare un numero.
Il problema con gli interi sequenziali: sono prevedibili (/users/1, /users/2) — chiunque può enumerare le tue risorse. Richiedono un'autorità centrale per emetterli (solo un server può decidere il numero "successivo"). E rivelano informazioni sull'attività (il tuo millesimo ordine ha ID 1000).
Così il mondo ha inventato ID migliori. E ha continuato a inventarne altri. Ecco cosa fa ciascuno.
UUID (v4) — La Scelta Predefinita Sicura
Formato: 550e8400-e29b-41d4-a716-446655440000
Lunghezza: 36 caratteri (32 esadecimali + 4 trattini)
Casualità: 122 bit
UUID v4 è composto da 122 bit casuali formattati in modo standard. La probabilità di collisione è così astronomicamente bassa (dovresti generare 1 miliardo di UUID al secondo per 85 anni per avere il 50% di probabilità di collisione) che è praticamente impossibile.
Cosa fa bene UUID:
- Standard universale — ogni linguaggio, database e framework ha supporto nativo per UUID
- Nessun coordinamento necessario — qualsiasi server, qualsiasi client può generarne uno indipendentemente
- Non sequenziale — nessun attacco di enumerazione
Cosa fa male UUID:
- Non ordinabile — gli UUID sono casuali, quindi non si ordinano per data di creazione. In un indice B-tree (come funzionano la maggior parte dei database), gli inserimenti casuali causano "page split" — il database riorganizza costantemente il suo indice. Su larga scala, questo è costoso.
- Grande: 36 caratteri come stringa, 16 byte come binario
- Non sicuro per URL (contiene trattini)
Usa UUID v4 quando: hai bisogno di un ID standard e ampiamente supportato e non ti preoccupi dell'ordinamento.
UUID v7 — UUID Migliorato
Formato: 018e2c4c-3d12-7f3a-91f8-3e4a5b6c7d8e
Lunghezza: 36 caratteri
Casualità: 74 bit (con prefisso timestamp a 48 bit in millisecondi)
UUID v7 (ratificato nel 2023) è UUID con un prefisso timestamp. I primi 48 bit sono un timestamp Unix in millisecondi, rendendo gli UUID ordinabili per data di creazione.
Perché questo è importante: ID ordinabili = inserimenti B-tree sequenziali = prestazioni degli indici del database notevolmente migliori su larga scala.
Usa UUID v7 quando: vuoi la compatibilità UUID ma hai bisogno di ID ordinati per tempo per le prestazioni del database.
ULID — Alternativa UUID Ordinabile e Sicura per URL
Formato: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Lunghezza: 26 caratteri
Casualità: 80 bit (con prefisso timestamp a 48 bit in millisecondi)
ULID (Universally Unique Lexicographically Sortable Identifier) risolve il problema di ordinamento di UUID con un formato più pulito. Codifica 48 bit di timestamp + 80 bit di casualità in Crockford Base32 (nessun trattino, nessun carattere ambiguo).
Cosa fa bene ULID:
- Ordinabile lessicograficamente (si ordina correttamente come stringa)
- Sicuro per URL (nessun trattino o carattere speciale)
- 26 caratteri contro i 36 di UUID — più compatto
- Timestamp con precisione al millisecondo incorporato
Cosa fa male ULID:
- Meno universale di UUID — richiede una libreria nella maggior parte dei linguaggi
- Monotonia: più ULID generati nello stesso millisecondo potrebbero non ordinarsi correttamente senza la variante monotonica
Usa ULID quando: vuoi ID ordinabili che siano anche compatti e sicuri per URL, e non hai bisogno della compatibilità UUID.
CUID2 — Sicuro per URL, Resistente alle Collisioni, Senza Timestamp
Formato: clyg4v5l20000356ok1f5t6nb
Lunghezza: 24 caratteri (predefinito)
Casualità: alta (fingerprinting SHA-3, nessuna struttura prevedibile)
CUID2 (Collision-Resistant Unique IDentifier) è progettato per contesti sensibili alla sicurezza. A differenza di ULID, non ha deliberatamente un prefisso timestamp — non puoi dedurre quando è stata creata una risorsa dal suo ID.
Cosa fa bene CUID2:
- Più sicuro di UUID/ULID per ID rivolti al pubblico (nessuna informazione temporale)
- Sicuro per URL
- Lunghezza configurabile (compromesso tra lunghezza e resistenza alle collisioni)
Cosa fa male CUID2:
- Non ordinabile (per design)
- Meno ampiamente supportato di UUID
- Dipende da una libreria specifica
Usa CUID2 quando: gli ID sono rivolti al pubblico e non vuoi rivelare i timestamp di creazione (ID utente, chiavi API, link brevi).
NanoID — Piccolo, Veloce, Personalizzabile
Formato: V1StGXR8_Z5jdHi6B-myT
Lunghezza: 21 caratteri (predefinito, configurabile)
Alfabeto: personalizzabile (predefinito: Base64 sicuro per URL)
NanoID è una moderna alternativa minimalista a UUID. Stessa probabilità di collisione di UUID v4 con 21 caratteri, ma più piccolo e con un alfabeto personalizzabile.
Cosa fa bene NanoID:
- Il più piccolo del gruppo (21 caratteri contro i 36 di UUID)
- Alfabeto personalizzabile — può generare ID usando solo lettere minuscole, solo numeri, ecc.
- Disponibile in 20+ linguaggi
- Veloce
Cosa fa male NanoID:
- Non ordinabile
- Non è uno standard (nessun RFC)
Usa NanoID quando: le dimensioni contano (URL, token brevi) o hai bisogno di un alfabeto personalizzato.
Tabella di Confronto
| UUID v4 | UUID v7 | ULID | CUID2 | NanoID | |
|---|---|---|---|---|---|
| Ordinabile | ✗ | ✓ | ✓ | ✗ | ✗ |
| Sicuro per URL | ✗ | ✗ | ✓ | ✓ | ✓ |
| Standard (RFC) | ✓ | ✓ | ✗ | ✗ | ✗ |
| Prestazioni DB | Scarsa | Buona | Buona | Scarsa | Scarsa |
| Nasconde timestamp | ✓ | ✗ | ✗ | ✓ | ✓ |
| Dimensione (caratteri) | 36 | 36 | 26 | 24 | 21 |
La Risposta Semplice
- Scelta predefinita: UUID v7 — ordinabile, standard, ottime prestazioni DB
- Hai bisogno di URL-safe + ordinabile: ULID
- ID pubblici (non rivelare il timing): CUID2
- Token brevi, alfabeto personalizzato: NanoID
- Sistema legacy / massima compatibilità: UUID v4
Genera ID Ora
Il Generatore UUID genera UUID v4 e v7 — generazione in massa, copia con un clic. Nessun account richiesto.