Cos'è ULID?
ULID (Identificatore Universalmente Unico e Lessicograficamente Ordinabile) è un formato identificatore a 128 bit progettato per superare le limitazioni degli UUID. Consiste in:
- Timestamp: 48 bit di tempo Unix con precisione al millisecondo
- Randomness: 80 bit di dati casuali crittograficamente sicuri
- Encoding: rappresentazione Base32 (26 caratteri)
Esempio di formato: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Come funziona ULID
- Genera 48 bit per il timestamp (tempo Unix in millisecondi)
- Genera 80 bit di dati casuali crittograficamente sicuri
- Combina il timestamp (più significativo) con la casualità (meno significativa)
- Codifica l'intero valore a 128 bit usando l'alfabeto Base32 di Crockford
- Il risultato è una stringa di 26 caratteri (i primi 10 caratteri sono il timestamp, gli ultimi 16 la casualità)
Vantaggi e considerazioni
Advantages | Considerations |
---|---|
|
|
Struttura ULID
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48 bit | 10 caratteri | Timestamp Unix (ms) codificato in Base32 |
Randomness | 80 bit | 16 caratteri | Byte casuali codificati in Base32 |
Confronto ULID vs. UUID
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128 bit | 128 bit | 128 bit | 128 bit |
Lunghezza stringa | 26 caratteri | 36 caratteri | 36 caratteri | 36 caratteri |
Time-based | ✅ | ✅ | ❌ | ✅ |
Ordinamento naturale | ✅ | ❌ | ❌ | ✅ |
Sicuro per URL | ✅ | ❌ | ❌ | ❌ |
Esposizione dell'indirizzo MAC | ❌ | ✅ | ❌ | ❌ |
Componente casuale | ✅ | ❌ | ✅ | ✅ |
Standard canonico | ❌ | ✅ | ✅ | ⚠️ Bozza |
Casi d'uso comuni
- Chiavi primarie di database: Indici ottimizzati per le prestazioni
- Sistemi distribuiti: Generazione senza coordinamento
- APIs: Identificatori puliti e sicuri per URL
- Dati di serie temporali: Ordinamento cronologico nativo
- Sistemi di log: Identificatori di eventi ordinabili
- Applicazioni moderne: Dove le limitazioni degli UUID sono problematiche
Perché scegliere ULID?
- Sortability: Ordina lessicograficamente per tempo di creazione
- Sicurezza per URL: Nessuna codifica URL necessaria (a differenza degli UUID con trattini)
- Compactness: 26 caratteri contro 36 per UUID
- Insensibilità al maiuscolo/minuscolo: Riduce gli errori di input dell'utente
- Monotonicity: Ordinamento monotono opzionale all'interno dello stesso millisecondo
- Nessun carattere speciale: Formato semplice, solo alfanumerico
Domande frequenti
Come si confronta ULID con UUID v7?
Entrambi utilizzano timestamp Unix per la possibilità di ordinamento e hanno componenti casuali. Le principali differenze sono la codifica (Base32 vs esadecimale), il formato (26 caratteri vs 36) e la standardizzazione (UUID v7 è in bozza di specifica RFC).
Posso estrarre il tempo di creazione da un ULID?
Sì. I primi 10 caratteri rappresentano un timestamp Unix con precisione al millisecondo che può essere decodificato e convertito in una data/ora standard.
Gli ULID sono compatibili con i campi UUID dei database?
No. Gli ULID usano un formato diverso e devono essere memorizzati come stringhe o dati binari piuttosto che nei tipi nativi UUID dei database.
Cos'è la monotonicità negli ULID?
Alcune implementazioni ULID offrono un'opzione monotona che garantisce un ordine di ordinamento sequenziale anche all'interno dello stesso millisecondo incrementando la componente casuale per gli ULID creati nello stesso timestamp.
Quale set di caratteri usa ULID?
ULID usa la codifica Base32 di Crockford (0-9, A-Z escludendo I, L, O, U) progettata per minimizzare confusione ed errori di trascrizione quando gli ID sono letti o inseriti manualmente.
Resources
Alfabeto Base32 di Crockford
Valore di codifica | Character | Notes |
---|---|---|
0-9 | 0-9 | Cifre decimali |
10-31 | A-Z | Escludendo I, L, O, U per leggibilità |
Caratteri: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
Questa codifica è insensibile al maiuscolo/minuscolo per la decodifica (ma gli ULID sono tipicamente generati in maiuscolo).