Gerador ULID
Gera identificadores únicos com ordenação lexicográfica
Clique em Gerar para criar ULIDs
O que é um ULID?
ULID (Identificador Universalmente Único Lexicograficamente Ordenável) é um formato de identificador de 128 bits projetado para ser tanto único quanto naturalmente ordenável. Ao contrário do UUID v4, que é totalmente aleatório, um ULID incorpora um timestamp Unix com precisão de milissegundos em seus bits mais significativos — garantindo que IDs gerados mais tarde sejam ordenados após IDs gerados antes.
ULIDs são codificados usando o alfabeto Crockford Base32, produzindo uma string compacta de 26 caracteres que é segura para URL, insensível a maiúsculas e livre de caracteres visualmente ambíguos.
A especificação ULID foi criada por Alizain Feerasta e é amplamente usada em sistemas distribuídos, event sourcing e chaves primárias de banco de dados onde tanto unicidade quanto ordenação temporal importam. ULIDs não são um padrão IETF — são uma especificação comunitária disponível em ulid.github.io.
Estrutura ULID
Um ULID tem 128 bits de largura, dividido em dois componentes:
| Timestamp | Aleatório |
|---|---|
| 01ARZ3NDEK | TSVE4RRFFQ69G5FAV |
| 48 bits — timestamp Unix em milissegundos. Codifica o tempo de geração com precisão de 1 ms. Cobre datas até o ano 10889. | 80 bits — dados aleatórios criptograficamente seguros. Regenerados frescos para cada ULID (a menos que o modo de monotonicidade seja usado). |
Codificado como 26 caracteres Crockford Base32: os primeiros 10 caracteres representam o timestamp, os últimos 16 representam o componente aleatório.
Alfabeto Crockford Base32
ULIDs usam a codificação Crockford Base32, que usa 32 dos 36 caracteres alfanuméricos. O alfabeto é: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
Quatro caracteres são intencionalmente excluídos:
IeLsão excluídos — facilmente confundidos com o dígito1Oé excluído — facilmente confundido com o dígito0Ué excluído — evita palavras obscenas acidentais nos IDs gerados- A codificação é
insensível a maiúsculas—01ARZ3NDEKTSV4RRFFQ69G5FAVe01arz3ndektsv4rrffq69g5favsão o mesmo ULID
Crockford Base32 é mais eficiente que hexadecimal (32 símbolos vs 16) e mais legível para humanos que Base64 (sem caracteres + / =, insensível a maiúsculas).
ULID vs UUID
ULIDs e UUIDs ambos representam identificadores de 128 bits, mas diferem significativamente em codificação e objetivos de design:
| Propriedade | ULID | UUID |
|---|---|---|
| Formato | Crockford Base32 | Hexadecimal com hífens |
| Comprimento | 26 caracteres | 36 caracteres |
| Timestamp | Unix ms de 48 bits | Nenhum (v4) ou ms de 48 bits (v7) |
| Ordenável | Sim — lexicográfico | Não (v4) / Sim (v7) |
| Seguro para URL | Sim (apenas alfanumérico) | Sim (com hífens) |
| Dependências | Requer biblioteca | Nativo (crypto.randomUUID) |
| Suporte BD | Armazenar como CHAR(26) ou BINARY(16) | Tipo de coluna UUID nativo |
| Especificação | Especificação comunitária (ulid.github.io) | RFC 4122 / RFC 9562 |
Se você já está em um ecossistema UUID (colunas uuid do PostgreSQL, APIs REST, ORMs com suporte a UUID), UUID v7 geralmente é uma opção melhor que ULID. Se você prefere uma codificação mais amigável para humanos e controla toda a stack, ULID é uma excelente escolha.
ULID vs nanoid
Tanto ULID quanto nanoid produzem identificadores curtos e seguros para URL, mas têm objetivos de design diferentes:
| Propriedade | ULID | NanoID |
|---|---|---|
| Timestamp | Sim — Unix ms de 48 bits | Não |
| Ordenável | Sim | Não |
| Comprimento padrão | 26 caracteres | 21 caracteres |
| Entropia | 80 bits (componente aleatório) | ~126 bits |
| Alfabeto | Crockford Base32 (32 chars) | Base64 seguro para URL (64 chars) |
| Comprimento personalizável | Não | Sim (qualquer comprimento) |
| Caso de uso | IDs ordenados por tempo, chaves primárias BD | Tokens aleatórios, URLs curtas, chaves API |
Escolha ULID quando precisar de ordenação temporal. Escolha nanoid quando precisar de máxima entropia em uma string aleatória curta.
Usando ULIDs em Bancos de Dados
ULIDs podem ser armazenados em bancos de dados de várias formas dependendo de seus requisitos:
Exemplos de Código
A geração de ULID requer a biblioteca ulid (disponível para JavaScript, Python, Go, Rust e mais):
// Using the 'ulid' npm package
import { ulid } from 'ulid'
const id = ulid() // "01ARZ3NDEKTSV4RRFFQ69G5FAV"
const id2 = ulid() // "01ARZ3NDEKXXXXXXXXXXXX..." (same ms, incremented random)
// With a custom timestamp
const id3 = ulid(1469918176385) // deterministic time portion
// Extract the timestamp back out
import { decodeTime } from 'ulid'
decodeTime(id) // → 1469918176385 (Unix ms)# Using python-ulid
from ulid import ULID
uid = ULID()
str(uid) # "01ARZ3NDEKTSV4RRFFQ69G5FAV"
uid.timestamp # 1469918176.385
uid.datetime # datetime(2016, 7, 30, 23, 36, 16, 385000, tzinfo=timezone.utc)
# Parse an existing ULID string
parsed = ULID.from_str("01ARZ3NDEKTSV4RRFFQ69G5FAV")
parsed.timestamp # 1469918176.385-- Store ULIDs as TEXT or CHAR(26)
CREATE TABLE events (
id CHAR(26) PRIMARY KEY DEFAULT gen_ulid(), -- if using a PG extension
name TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Or pass the ULID from your application layer
INSERT INTO events (id, name, created_at)
VALUES ('01ARZ3NDEKTSV4RRFFQ69G5FAV', 'user.signup', NOW());
-- Range queries are efficient because ULIDs sort chronologically
SELECT * FROM events
WHERE id > '01ARZ3NDEKTSV4RRFFQ69G5FAV'
ORDER BY id
LIMIT 20;// Pure browser / Deno / Node.js implementation (no dependencies)
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'
function encodeTime(ms) {
let result = '', n = BigInt(ms)
for (let i = 9; i >= 0; i--) {
result = CROCKFORD[Number(n & 31n)] + result
n >>= 5n
}
return result
}
function encodeRandom(bytes) {
let n = 0n
for (const b of bytes) n = (n << 8n) | BigInt(b)
let result = ''
for (let i = 15; i >= 0; i--) {
result = CROCKFORD[Number(n & 31n)] + result
n >>= 5n
}
return result
}
function generateULID() {
const randomBytes = new Uint8Array(10)
crypto.getRandomValues(randomBytes)
return encodeTime(Date.now()) + encodeRandom(randomBytes)
}