Gerador de ULID online
Escolha a quantidade e clique em Gerar ULID. Para descobrir quando um ULID foi criado, cole-o no campo Decodificar um ULID.
Decodificar um ULID
Os ULIDs são gerados no seu navegador com um gerador criptográfico; nada é enviado a servidores.
O que é ULID?
ULID (Universally Unique Lexicographically Sortable Identifier) é um identificador de 128 bits, do mesmo tamanho de um UUID, mas escrito em apenas 26 caracteres e feito para ficar em ordem cronológica quando ordenado como texto. A especificação divide os 128 bits em duas partes:
01ARZ3NDEK TSV4RRFFQ69G5FAV
|----------| |----------------|
tempo aleatório
48 bits 80 bits
10 caracteres 16 caracteres- Tempo (48 bits): o instante da criação em milissegundos desde 01/01/1970 UTC (o timestamp Unix). Cabe até o ano 10889.
- Aleatório (80 bits): sorteado a cada ULID, de preferência por uma fonte criptográfica. São 2⁸⁰ ≈ 1,21 × 10²⁴ combinações por milissegundo.
O ULID do exemplo acima, 01ARZ3NDEKTSV4RRFFQ69G5FAV, carrega o timestamp 1469922850259, ou seja, 30/07/2016 às 20:54:10,259 no horário de Brasília (23:54:10.259 UTC). Cole-o no decodificador para conferir.
O alfabeto: Base32 de Crockford
Cada caractere representa 5 bits e vem deste alfabeto de 32 símbolos:
0123456789ABCDEFGHJKMNPQRSTVWXYZAs letras I, L, O e U ficam de fora para evitar confusão com 1 e 0 (e palavras acidentais). O ULID não diferencia maiúsculas de minúsculas, não tem hifens nem caracteres especiais e pode ir direto numa URL. Atenção: esse alfabeto não é o do Base32 da RFC 4648 (A–Z e 2–7), usado pelo nosso Base32 Encode/Decode.
Por que o primeiro caractere vai só até 7?
Vinte e seis caracteres de 5 bits somam 130 bits, dois a mais que os 128 do ULID. Por isso o primeiro caractere só pode usar 3 bits, de 0 a 7. O maior ULID válido é 7ZZZZZZZZZZZZZZZZZZZZZZZZZ; qualquer texto que comece com 8 ou mais deve ser rejeitado — é o que o decodificador desta página faz.
O que é a opção monotônica?
Sem ela, dois ULIDs criados no mesmo milissegundo têm a mesma parte de tempo e partes aleatórias independentes: a ordem entre eles é imprevisível. No modo monotônico, previsto na especificação, o gerador guarda o último valor e, se o milissegundo não mudou, apenas soma 1 à parte aleatória:
01BX5ZZKBKACTAV9WEVGEMMVRZ
01BX5ZZKBKACTAV9WEVGEMMVS0
01BX5ZZKBKACTAV9WEVGEMMVS1Assim, uma lista gerada de uma vez já sai em ordem crescente. A garantia vale para um mesmo gerador: aqui, para os ULIDs criados nesta página enquanto ela estiver aberta. Dois servidores gerando em paralelo continuam sem ordem garantida dentro do mesmo milissegundo.
ULID vs UUID
| ULID | UUID v4 | UUID v7 | |
|---|---|---|---|
| Tamanho | 128 bits | 128 bits | 128 bits |
| Texto | 26 caracteres | 36 caracteres | 36 caracteres |
| Ordenável por data | Sim | Não | Sim |
| Tempo embutido | 48 bits (ms) | Não tem | 48 bits (ms) |
| Bits aleatórios | 80 | 122 | 74 |
| Padrão | Especificação aberta (ulid/spec) | RFC 9562 | RFC 9562 |
O ULID e o UUID v7 resolvem o mesmo problema: chaves primárias aleatórias (como o UUID v4) espalham as inserções pelo índice do banco de dados, enquanto identificadores que começam pelo tempo são gravados em sequência. Se o seu banco ou linguagem já tem um tipo uuid nativo, o UUID v7 costuma encaixar melhor; se você quer um texto mais curto, sem hifens e amigável para URLs, o ULID é uma boa escolha. Como ambos têm 128 bits, dá para guardar um ULID numa coluna uuid ou BINARY(16) — o decodificador mostra os 128 bits no formato de UUID. Para gerar UUIDs, use o Gerador de UUID.
Limitações e cuidados
- O ULID revela a data de criação. Qualquer pessoa pode decodificar os 10 primeiros caracteres. Não use ULID onde o momento do cadastro é informação sensível.
- Não é um token secreto. A parte de tempo é previsível e, no modo monotônico, o próximo valor também. Para senhas e chaves, use o Gerador de Senha.
- A ordenação depende do relógio. Máquinas com relógios desajustados geram ULIDs fora de ordem entre si.
- O decodificador confere o formato e extrai a data; ele não tem como saber se o ULID existe em algum sistema.
Perguntas frequentes
ULID pode repetir?
Na prática, não. Para haver colisão, dois ULIDs teriam de ser criados no mesmo milissegundo e sortear os mesmos 80 bits, uma chance em cerca de 1,2 septilhão para cada par.
Como descobrir a data de um ULID?
Cole o ULID no campo de decodificação desta página. Os 10 primeiros caracteres são o timestamp Unix em milissegundos; a ferramenta mostra a data em Brasília e em UTC. Para converter o número em outras datas, use o Conversor de Timestamp.
ULID diferencia maiúsculas de minúsculas?
Não. 01arz3ndektsv4rrffq69g5fav e 01ARZ3NDEKTSV4RRFFQ69G5FAV são o mesmo ULID. A forma usual é em maiúsculas; a opção Minúsculas existe para sistemas que padronizam assim. Só não misture as duas formas na mesma coluna de texto, porque a ordenação alfabética deixaria de bater com a cronológica.
Posso converter ULID em UUID?
Sim, os dois têm 128 bits: basta escrever os mesmos bits em hexadecimal no formato 8-4-4-4-12. O resultado é aceito por colunas uuid, mas não é um UUID v4 nem v7 “de verdade”, pois os bits de versão e variante ficam com valores quaisquer. Para conferir um UUID, use o Validador de UUID.
Os ULIDs gerados aqui são seguros para produção?
Eles seguem a especificação e usam o gerador criptográfico do navegador (crypto.getRandomValues), e nada é enviado a servidores. Para uso contínuo em um sistema, porém, o normal é gerar os ULIDs na própria aplicação, com uma biblioteca da sua linguagem.