O que é ULID?
ULID (Identificador Universalmente Único e Lexicograficamente Ordenável) é um formato de identificador de 128 bits projetado para superar limitações dos UUIDs. Consiste em:
- Timestamp: 48 bits de tempo Unix com precisão em milissegundos
- Randomness: 80 bits de dados aleatórios criptograficamente seguros
- Encoding: Representação Base32 (26 caracteres)
Exemplo de formato: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Como o ULID funciona
- Gera 48 bits para timestamp (tempo Unix em milissegundos)
- Gera 80 bits de dados aleatórios criptograficamente seguros
- Combina timestamp (mais significativo) com aleatoriedade (menos significativo)
- Codifica o valor completo de 128 bits usando o alfabeto Base32 de Crockford
- O resultado é uma string de 26 caracteres (os 10 primeiros são timestamp, os 16 últimos são aleatoriedade)
Vantagens e Considerações
Advantages | Considerations |
---|---|
|
|
Estrutura ULID
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48 bits | 10 caracteres | Timestamp Unix (ms) codificado em Base32 |
Randomness | 80 bits | 16 caracteres | Bytes aleatórios codificados em Base32 |
Comparação ULID vs. UUID
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128 bits | 128 bits | 128 bits | 128 bits |
Comprimento da string | 26 caracteres | 36 caracteres | 36 caracteres | 36 caracteres |
Time-based | ✅ | ✅ | ❌ | ✅ |
Ordenação natural | ✅ | ❌ | ❌ | ✅ |
Seguro para URL | ✅ | ❌ | ❌ | ❌ |
Exposição de endereço MAC | ❌ | ✅ | ❌ | ❌ |
Componente aleatório | ✅ | ❌ | ✅ | ✅ |
Padrão canônico | ❌ | ✅ | ✅ | ⚠️ Rascunho |
Casos de Uso Comuns
- Chaves primárias de banco de dados: Índices otimizados para desempenho
- Sistemas distribuídos: Geração sem coordenação
- APIs: Identificadores limpos e seguros para URL
- Dados de séries temporais: Ordenação cronológica nativa
- Sistemas de log: Identificadores de eventos ordenáveis
- Aplicações modernas: Onde as limitações do UUID são problemáticas
Por que escolher ULID?
- Sortability: Ordena lexicograficamente pelo tempo de criação
- Segurança para URL: Nenhuma codificação de URL necessária (ao contrário dos UUIDs com hífens)
- Compactness: 26 caracteres vs 36 para UUID
- Insensibilidade a maiúsculas/minúsculas: Reduz erros de entrada do usuário
- Monotonicity: Ordenação monotônica opcional dentro do mesmo milissegundo
- Sem caracteres especiais: Formato simples, apenas alfanumérico
Perguntas Frequentes
Como o ULID se compara ao UUID v7?
Ambos usam timestamps Unix para ordenação e possuem componentes aleatórios. As principais diferenças são a codificação (Base32 vs hex), formato (26 caracteres vs 36) e padronização (UUID v7 está em especificação RFC em rascunho).
Posso extrair o tempo de criação de um ULID?
Sim. Os primeiros 10 caracteres representam um timestamp Unix com precisão em milissegundos que pode ser decodificado e convertido para um datetime padrão.
ULIDs são compatíveis com campos UUID em bancos de dados?
Não. ULIDs usam um formato diferente e precisam ser armazenados como strings ou dados binários, em vez de tipos nativos UUID em bancos de dados.
O que é monotonicidade em ULIDs?
Algumas implementações de ULID oferecem uma opção monotônica que garante ordem sequencial mesmo dentro do mesmo milissegundo, incrementando o componente aleatório para ULIDs criados no mesmo timestamp.
Qual conjunto de caracteres o ULID usa?
ULID usa a codificação Base32 de Crockford (0-9, A-Z excluindo I, L, O, U) que é projetada para minimizar confusão e erros de transcrição quando os IDs são lidos ou inseridos manualmente.
Resources
Alfabeto Base32 de Crockford
Valor de Codificação | Character | Notes |
---|---|---|
0-9 | 0-9 | Dígitos decimais |
10-31 | A-Z | Excluindo I, L, O, U para legibilidade |
Caracteres: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
Esta codificação é insensível a maiúsculas/minúsculas para decodificação (mas ULIDs são tipicamente gerados em maiúsculas).