In breve: UUID v4 è la scelta predefinita sicura per ID univoci casuali, ULID è meglio quando vuoi anche ID che si ordinano per data di creazione, e NanoID è ideale quando servono ID corti e adatti agli URL. Tutti e tre evitano il coordinamento tra sistemi, ma bilanciano in modo diverso lunghezza, ordinabilità e comportamento negli indici del database. Questa guida spiega cosa sono e quando usarli.

Un identificatore univoco permette a sistemi indipendenti di creare record senza chiedere a un server centrale «qual è il prossimo numero?». Questa indipendenza è il punto centrale: due servizi, o due dispositivi offline, possono generare ciascuno un ID e restare certi che i valori non collideranno.

Cos'è davvero un UUID

Un UUID è un valore a 128 bit, di norma scritto come 36 caratteri — 32 cifre esadecimali più quattro trattini, come 550e8400-e29b-41d4-a716-446655440000. La versione che vuoi quasi sempre è UUID v4, che riempie 122 di quei bit con casualità. Ne derivano circa 5,3 × 10³⁶ valori possibili, quindi una collisione non è qualcosa da gestire: dovresti generare nell'ordine di un trilione di miliardi di UUID prima che la probabilità di uno scontro raggiunga anche solo il 50%.

«Trascurabile» non significa «impossibile», ma in pratica v4 offre unicità senza alcun coordinamento centrale.

UUID v4 vs v1

UUID v1 è costruito da un timestamp più l'indirizzo di rete (MAC) della macchina generatrice. Questo rende v1 grosso modo ordinato nel tempo, ma può rivelare dove e quando è stato creato un ID — a volte un problema di privacy. UUID v4 rinuncia a tutto ciò a favore della pura casualità: nessun ordine, nessun metadato incorporato, nulla da rivelare. Per la maggior parte delle applicazioni v4 è il default giusto, e v1 conviene solo quando serve davvero la sua componente temporale.

ULID: ordinabile per progettazione

Un ULID è anch'esso a 128 bit, ma codificato come 26 caratteri Crockford base32 invece che esadecimali con trattini. I primi 48 bit sono un timestamp in millisecondi e gli 80 restanti sono casuali. Poiché il timestamp è in testa, gli ULID si ordinano lessicograficamente nell'ordine in cui sono stati creati: ordina le stringhe e ottieni l'ordine cronologico gratis. È una proprietà davvero utile: rende economiche le query «più recenti prima» e mantiene gli inserimenti nel database ordinati invece che sparsi.

NanoID: corto e adatto agli URL

Un NanoID usa per impostazione predefinita 21 caratteri da un alfabeto URL-safe, quindi entra in un link senza percent-encoding. La lunghezza è configurabile, il che ti fa bilanciare dimensione e resistenza alle collisioni: ID più corti sono più ordinati ma lasciano meno casualità, quindi tienili più lunghi per identificatori pubblici o ad alto volume. NanoID brilla per link di condivisione, ID pubblici brevi e ovunque un UUID di 36 caratteri risulterebbe ingombrante in un URL.

Quale scegliere per una chiave di database?

Qui la scelta ha conseguenze concrete sulle prestazioni. UUID v4 è perfettamente valido come chiave primaria, ma la sua casualità fa sì che le nuove righe si inseriscano in posizioni casuali di un indice B-tree, causando frammentazione e più page split man mano che la tabella cresce. Gli identificatori ordinati nel tempo — ULID, o il più recente UUID v7 — si inseriscono in ordine grosso modo crescente, il che mantiene l'indice compatto e le scritture locali. Se scegli una chiave per una tabella grande e con molte scritture, preferisci un ID ordinato nel tempo; per tabelle piccole la differenza conta di rado.

Errori comuni da evitare

  • Esporre pubblicamente ID interi sequenziali quando volevi ID non indovinabili — è un compito per un ID casuale, non per un auto-increment.
  • Usare UUID v4 casuale come chiave clusterizzata di una tabella enorme e poi chiedersi perché gli inserimenti rallentano.
  • Troncare un UUID per «risparmiare spazio» — butti via la casualità che garantisce l'unicità.
  • Accorciare troppo un NanoID per un identificatore ad alto volume, aumentando il rischio di collisioni.

Adatta l'ID al compito: usa il Generatore di UUID per creare valori v4, v1, ULID o NanoID, scegli v4 per l'unicità generale, ULID quando conta l'ordine e NanoID quando l'ID deve vivere in un URL.