1. O Que E ULID
ULID (Universally Unique Lexicographically Sortable Identifier) e um formato de identificador unico criado como alternativa ao UUID, com a propriedade adicional de ser ordenavel lexicograficamente por tempo de criacao. Isso significa que um simples sort alfabetico nos IDs resulta automaticamente na ordenacao por data de criacao.
Isso e extremamente util em bancos de dados, sistemas de eventos e filas de mensagens onde a ordenacao temporal e necessaria sem precisar de um campo de timestamp separado.
2. Estrutura do Identificador
Um ULID e composto por 26 caracteres em Crockford Base32, divididos em duas partes:
- 10 caracteres de timestamp (48 bits): representam os milissegundos desde o epoch Unix. Isso garante ordenacao cronologica automatica e permite representar datas ate o ano 10889.
- 16 caracteres aleatorios (80 bits): componente de aleatoriedade criptograficamente segura que garante unicidade global. Com 80 bits de entropia, a probabilidade de colisao e praticamente zero.
3. Crockford Base32
O ULID usa o alfabeto Crockford Base32, que exclui letras facilmente confundidas (I, L, O, U) para melhorar a legibilidade humana: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
O encoding e case-insensitive, o que facilita copiar e colar sem preocupacao com capitalizacao.
"ULIDs sao especialmente valiosos em sistemas distribuidos onde multiplas instancias geram IDs simultaneamente — a ordenacao por tempo elimina a necessidade de um sequenciador central."
4. ULID vs UUID: Quando Usar Cada Um
Use ULID quando:
- A ordenacao cronologica dos registros for importante para o negocio.
- Voce quiser IDs mais curtos e legiveis que UUID (26 vs 36 caracteres).
- Quiser melhorar a performance de indices em bancos de dados relacionais (ULIDs geram menos fragmentacao de B-tree que UUIDs aleatorios).
Use UUID v4 quando:
- A compatibilidade com sistemas legados que esperam o formato UUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) for obrigatoria.
- Voce precisar ocultar informacao temporal dos IDs por razoes de privacidade.
5. ULID em Bancos de Dados
ULIDs podem ser armazenados como:
- CHAR(26): armazenamento direto como string, simples e compativel com qualquer banco.
- UUID (128 bits): convertendo o ULID para a representacao binaria UUID, economizando espaco e aproveitando tipos nativos.
- BINARY(16): representacao binaria compacta para bancos que nao tem tipo UUID nativo.
Em bancos como PostgreSQL e MySQL, armazenar como string CHAR(26) com indice e geralmente suficiente. A ordenacao lexicografica do ULID funciona corretamente com ORDER BY na coluna.
6. Perguntas Frequentes
E possivel extrair o timestamp de um ULID?
Sim. Os primeiros 10 caracteres do ULID codificam o timestamp em milissegundos. Nossa ferramenta exibe o timestamp decodificado ao lado de cada ULID gerado.
O ULID e criptograficamente seguro?
O componente aleatorio usa crypto.getRandomValues(), que e criptograficamente seguro. No entanto, o timestamp e visivel no ID — se isso for um problema de privacidade, use UUID v4.
Dois ULIDs gerados no mesmo milissegundo podem colidir?
A probabilidade e extremamente baixa: com 80 bits de aleatoriedade, voce precisaria gerar ~1.2 x 10^12 IDs no mesmo milissegundo para ter 50% de chance de colisao. Na pratica, isso e impossivel.