Generatore di ULID

Genera in blocco gli ULID, identificativi ordinabili cronologicamente che si possono usare in alternativa agli UUID.

Consigli per l'uso

  • Un ULID è composto di dieci caratteri iniziali che formano la marca temporale, cioè il momento della generazione, e di sedici caratteri casuali. Salvo per gli identificativi generati nello stesso millesimo di secondo, basta ordinarli come stringhe per disporli secondo l'ordine di creazione.
  • Usare un UUID v4, del tutto casuale, come chiave primaria di una base di dati fa sì che la posizione di inserimento nell'indice sia casuale, favorendo la frammentazione degli indici ad albero; gli ULID, ordinandosi cronologicamente, occupano posizioni pressoché contigue e attenuano il problema.
  • Un ULID si scrive con ventisei caratteri della codifica Base32 di Crockford — le cifre e le lettere maiuscole, escluse le quattro che si confondono facilmente — ed è quindi più breve di un UUID, che ne conta trentasei compresi i trattini, e si tratta in sicurezza anche negli ambienti che non distinguono maiuscole e minuscole.
  • Per il confronto con i formati Nano ID e UUID v4, consultate anche la tabella riportata nella pagina affine dedicata alla generazione di Nano ID.

Domande frequenti

ULID è la sigla di «identificativo universalmente unico e ordinabile lessicograficamente»: come l'UUID genera identificativi univoci a livello globale, ma contenendo l'informazione sull'istante di generazione permette di disporli in ordine cronologico con il semplice ordinamento delle stringhe.

La differenza maggiore sta nell'ordinabilità cronologica. L'UUID v4 è un valore a 128 bit del tutto casuale e non si può ordinare per generazione, mentre nell'ULID i primi 48 bit sono una marca temporale al millesimo di secondo e il solo confronto fra stringhe rivela l'ordine di creazione. Cambia anche la notazione: ventisei caratteri in Base32 per l'ULID, trentasei esadecimali compresi i trattini per l'UUID.

Usando come chiave un valore del tutto casuale come l'UUID v4, la posizione in cui una nuova riga si inserisce nell'indice è casuale, il che può frammentare gli indici ad albero e ridurre l'efficacia della memoria di transito. Gli ULID, ordinandosi cronologicamente, tendono a collocare le righe nuove verso la fine dell'indice e attenuano il problema.

I primi dieci caratteri sono la marca temporale a 48 bit, in millesimi di secondo, che copre fino all'anno 10889 circa; i sedici restanti sono un valore casuale a 80 bit. In tutto 128 bit, come un UUID, ma con l'informazione temporale incorporata: è questa la peculiarità dell'ULID.
Tool-kun

A proposito — ULID, che ha portato il tempo nel mondo degli identificativi

La specifica di ULID fu pubblicata nel 2016 da Alizain Feerasta. L'UUID era già allora il mezzo standard per generare identificativi univoci nei sistemi distribuiti, ma la sua totale casualità, e quindi l'impossibilità di ordinarlo, risultava scomoda per l'efficienza degli indici delle basi di dati e per l'analisi cronologica dei registri: da quella insoddisfazione nacque la nuova specifica.

Anche l'UUID conosce del resto varianti che comprendono l'informazione temporale, come la versione 1, fondata sull'indirizzo fisico della scheda di rete e su una marca temporale, e la versione 7, standardizzata nel 2024, che unisce marca temporale e valori casuali. ULID si distingue però per essere una specifica autonoma, indipendente da quella degli UUID, votata a una progettazione più semplice e a una notazione compatta grazie alla codifica Base32.

Oggi esistono librerie per ULID in quasi tutti i principali linguaggi di programmazione e il formato è largamente adottato dove conta conservare l'ordine di generazione: identificativi di evento nei sistemi distribuiti, codici di tracciamento nei registri, chiavi primarie delle basi di dati. Con l'UUID v7, comparso nello stesso periodo, condivide molti presupposti progettuali: i due convivono come approcci diversi al medesimo problema degli identificativi ordinabili.