Cos'è un ULID e perché usarlo
Un ULID (Universally Unique Lexicographically Sortable Identifier) è un formato di identificatore a 128 bit rappresentato da 26 caratteri. A differenza dei classici UUID, gli ULID sono pensati per essere compatti, ordinabili temporalmente e sicuri per gli URL. La pagina ulid-generator di questo tool online permette di generare da 1 a 100 ULID in un colpo solo, sfruttando esclusivamente la casualità del browser (crypto.getRandomValues()), senza inviare alcun dato a un server.
Ciò che distingue questa pagina dagli altri generatori dello stesso sito (UUID, NanoID, etc.) è la scelta di utilizzare l’alfabeto Crockford base32 (0‑9, A‑Z eccetto I, L, O, U). Questo alfabeto rende gli ULID case‑insensitive — non importa se scrivi in maiuscolo o minuscolo — e li priva di trattini, a differenza dei UUID che ne contengono quattro. Inoltre, i primi dieci caratteri codificano un timestamp in millisecondi (48 bit), il che rende gli ULID lessicograficamente ordinabili per istante di creazione: un ULID generato dopo un altro avrà una stringa alfanumerica più grande, purché siano passati almeno un millisecondo di differenza.
Come funziona la pagina: input e output
L’interfaccia è volutamente essenziale. Hai un selettore di formato (fissato su ULID, quindi nessuna opzione per aggiungere trattini o maiuscole — non servono), un campo numerico per il conteggio (da 1 a 100) e un pulsante di generazione. Una volta premuto, la pagina produce immediatamente la lista degli ULID richiesti, accompagnata da un messaggio di stato: “Pronto.” prima della generazione, “Generato.” dopo, e “Copiati tutti!” quando l’intero elenco viene copiato negli appunti.
Ogni singolo ULID può essere copiato cliccandoci sopra individualmente. La generazione avviene ogni volta che modifichi una qualsiasi opzione (conteggio o formato): non esiste una memorizzazione dello stato precedente. Il numero di ULID generati è sempre indicato in un contatore a fondo pagina.
La struttura interna di un ULID: timestamp e casualità
Un ULID è composto da 128 bit suddivisi esattamente in due parti:
- Timestamp (48 bit, primi 10 caratteri): rappresenta il numero di millisecondi trascorsi dall’epoca Unix (1970‑01‑01T00:00:00Z). Viene codificato in Crockford base32, producendo dieci caratteri. Grazie a questo prefisso, gli ULID sono monotonicamente crescenti nel tempo, a patto che ogni ID venga generato in un millisecondo diverso. Se due ULID nascono nello stesso millisecondo, l’ordinamento lessicografico non è garantito: il secondo componente casuale può invertire l’ordine.
- Componente casuale (80 bit, ultimi 16 caratteri): generato tramite un generatore di numeri pseudo-casuali crittograficamente sicuro (CSPRNG). I 16 caratteri codificano 80 bit di pura casualità, fornendo uno spazio di (2^‹80›) valori possibili per ogni millisecondo.
I 26 caratteri totali sono una stringa senza trattini, maiuscole o minuscole indifferenti (il tool normalmente li restituisce in maiuscolo, ma puoi convertirli senza problemi). L’assenza di caratteri ambigui (I/L/O/U) evita errori di lettura manuale.
Vantaggi rispetto a UUID e altri formati
| Caratteristica | UUID v4 (36 caratteri) | ULID (26 caratteri) |
|---|---|---|
| Lunghezza | 36 (con 4 trattini) | 26 (senza trattini) |
| Ordinabile temporalmente | No (completamente casuale) | Sì (timestamp iniziale) |
| Case‑insensitive | No | Sì (alfabeto Crockford) |
| Sicuro per URL | Sì (con escaping) | Sì (nessun carattere speciale) |
| Bit totali | 128 | 128 |
Rispetto a UUID v7 (bozza RFC 9562), che pure include un timestamp, ULID è più compatto e non richiede configurazioni di varianti o versioni. Mentre UUID v7 usa un formato a 36 caratteri con trattini, ULID rinuncia ai trattini e riduce la lunghezza del 28%. Per applicazioni dove lo spazio di archiviazione o la leggibilità in URL sono critici, ULID risulta vincente.
L’ordinamento temporale ha un impatto diretto sulle prestazioni dei database relazionali: inserire righe con chiavi primarie ordinate (come gli ULID) evita la frammentazione degli indici B‑tree causata dalle chiavi casuali dei UUID v4. Questo porta a scritture più veloci e a un minore overhead di manutenzione dell’indice.
Probabilità di collisione e generazione locale
Poiché i 16 caratteri casuali offrono 80 bit di entropia, la probabilità di generare due ULID identici è estremamente bassa. Per avere una collisione del 50%, dovresti generare circa (2^‹40›) ULID in un singolo millisecondo — un numero irrealistico per un generatore lato client. In pratica, la generazione locale nel browser è sicura: ogni ULID viene creato con window.crypto.getRandomValues(), lo stesso motore usato per chiavi crittografiche. Nessun dato esce dal tuo dispositivo.
Una nota importante: se generi molti ULID (es. 100) in un colpo solo, il timestamp di tutti sarà identico (perché la generazione avviene in meno di un millisecondo). In questo caso, l’ordinamento lessicografico tra quei 100 ID sarà basato solo sulla componente casuale, quindi non rifletterà un ordine di creazione reale. Se hai bisogno di ordinare ULID generati in rapida successione, considera di introdurre un piccolo ritardo programmatico o di usare un identificatore monotono come Snowflake.
Casi d’uso e chi dovrebbe usarlo
- Sviluppatori web e mobile che vogliono identificatori brevi, sicuri per URL e ordinabili senza dover aggiungere una colonna timestamp separata.
- Amministratori di database che progettano chiavi primarie per tabelle con alto carico di scrittura: gli ULID si inseriscono in modo sequenziale negli indici, migliorando le prestazioni rispetto a UUID casuali.
- Architetti di sistemi distribuiti che necessitano di identificatori unici su più nodi senza coordinazione centralizzata: la parte random garantisce unicità anche se due nodi generano ULID nello stesso millisecondo, purché i generatori siano indipendenti.
- Progettisti di API che espongono ID pubblici: la mancanza di trattini e la case‑insensitivity riducono gli errori di digitazione e rendono gli ID facili da usare in query URL, form HTML e messaggi di testo.
FAQ
1. Posso generare più di 100 ULID alla volta?
No, il tool accetta solo un conteggio compreso tra 1 e 100. Per generare più ID, ripeti la generazione più volte o esegui uno script locale.
2. Gli ULID sono veramente ordinabili per tempo?
Sì, fino alla risoluzione di un millisecondo. Due ULID generati in millisecondi diversi avranno una stringa lessicograficamente ordinata: quello con timestamp più grande viene dopo. Se generati nello stesso millisecondo, l’ordine è determinato dalla parte casuale (non garantito).
3. Qual è la differenza tra ULID e UUID v7?
Entrambi includono un timestamp. UUID v7 ha 36 caratteri (con trattini) e segue uno standard IETF più recente; ULID è più compatto (26 caratteri) e usa Crockford base32, che evita caratteri ambigui. La scelta dipende dall’ecosistema: se già usi UUID, v7 potrebbe essere più facile da adottare; se vuoi massima compattezza e leggibilità, ULID è superiore.
4. È sicuro usare ULID come chiave primaria?
Sì, ma tieni presente che il timestamp è deducibile dai primi 10 caratteri. Se la riservatezza temporale è un requisito (ad esempio non vuoi che si possa sapere quando è stato creato un record), un ULID non va bene. Per la maggior parte degli usi interni, la monotonicità è un vantaggio.
5. Come copio un singolo ULID?
Basta cliccare sul testo dell’identificatore nella lista. Il tool lo copia automaticamente negli appunti. Se invece clicchi sul pulsante “Copia tutto”, vengono copiati tutti gli ULID separati da a capo.
6. Perché non ci sono opzioni per maiuscole/minuscole o trattini?
Perché l’alfabeto Crockford base32 è per definizione case‑insensitive: non importa la capitalizzazione. I trattini non esistono nello standard ULID: a differenza dei UUID, non ci sono gruppi da separare. Aggiungere queste opzioni sarebbe stato fuorviante.