Pular para o conteúdo
nearnull

Gerador de ULID

Gere identificadores ULID ordenáveis por tempo, com modo monotônico opcional. Funciona totalmente no seu navegador: nada é enviado a nenhum servidor.

Opções

Identificadores criados no mesmo milissegundo continuam crescendo, então um lote fica na ordem de geração.

ULIDs

Os ULIDs gerados aparecem aqui

O que é um ULID?

Um ULID é um identificador de 128 bits, do mesmo tamanho que um UUID, escrito em 26 caracteres em vez de 36. Seus primeiros 48 bits são o momento de criação em milissegundos e os 80 restantes são aleatórios, então ordenar ULIDs como strings comuns os ordena por momento de criação. A codificação é Crockford Base32, que deixa de fora I, L, O e U: isso evita tanto as confusões entre dígitos e letras quando alguém lê um em voz alta, quanto a chance de um identificador soletrar algo infeliz. Tudo é gerado no seu navegador com a fonte aleatória criptográfica dele.

Como os 26 caracteres são divididos

1 - 1048 bits

Milissegundos desde a época Unix, big-endian. É isso que faz os ULIDs ordenarem cronologicamente, e é legível: a ferramenta decodifica esse valor para cada identificador que gera.

11 - 2680 bits

Bits aleatórios do gerador criptográfico do navegador. Com o modo monotônico ligado, dentro de um mesmo milissegundo eles são incrementados em vez de sorteados de novo, o que mantém o lote em ordem.

Exemplos

Como gerar ULIDs nas linguagens que você provavelmente vai usar:

JavaScript
import { ulid } from "ulid";

ulid(); // 01ARZ3NDEKTSV4RRFFQ69G5FAV
Python
import ulid

ulid.new().str
Java
import com.github.f4b6a3.ulid.UlidCreator;

UlidCreator.getMonotonicUlid().toString();
Go
import "github.com/oklog/ulid/v2"

ulid.Make().String()
PHP
use Ulid\Ulid;

Ulid::generate();
PostgreSQL
-- store as a 16-byte value, not text
CREATE TABLE orders (id bytea PRIMARY KEY);

Casos de uso

Chaves primárias que não fragmentam o índice

UUIDs aleatórios caem por todo lado em um índice B-tree, então cada inserção suja uma página diferente. ULIDs são ordenados por tempo, então as inserções se acumulam perto do fim do índice: por isso se comportam muito melhor como chaves primárias em volume.

Ordenar eventos sem uma coluna de timestamp separada

Como o tempo está embutido no valor, linhas de log, eventos e mensagens ordenam corretamente só pelo id, mesmo quando chegam fora de ordem ou de máquinas diferentes.

Identificadores que aparecem em URLs ou são ditados

26 caracteres em vez de 36, sem hifens, e sem I/L/O/U para confundir com 1/0. Isso torna os ULIDs bem mais fáceis de colar em uma URL, imprimir em uma etiqueta ou ditar por telefone.

Ids gerados no cliente

Assim como os UUIDs, ULIDs não precisam de coordenação: um navegador, um app móvel ou um worker offline pode criar um sem perguntar a um servidor, e ele continua único quando os dados sincronizam.

Perguntas frequentes

ULID ou UUID?
Use ULID quando os identificadores forem inseridos em um índice ordenado ou precisarem ordenar por momento de criação, e quando forem vistos por pessoas. Use UUID quando uma especificação, um tipo de coluna do banco ou um sistema existente esperar exatamente aquele formato. Vale conhecer também o UUIDv7: ele traz a mesma ordenação temporal para o formato UUID padrão.
O que o modo monotônico muda de fato?
Dentro de um mesmo milissegundo, ULIDs compartilham o mesmo prefixo de timestamp, então a ordem deles depende da cauda aleatória, que é efetivamente arbitrária. O modo monotônico, em vez disso, incrementa o valor aleatório anterior, garantindo que cada novo identificador ordene depois do último. Gerar um lote aqui é exatamente esse caso: todos compartilham um milissegundo.
ULIDs vazam quando um registro foi criado?
Sim, essa é a troca. O timestamp está ali nos primeiros dez caracteres e qualquer um pode decodificá-lo, como esta ferramenta faz. Se o momento de criação de um registro é sensível, ou se identificadores adivinháveis em sequência são um problema, use um identificador totalmente aleatório como UUIDv4.
Dois ULIDs podem colidir?
Com 80 bits aleatórios por milissegundo, gerar até milhares de identificadores no mesmo milissegundo deixa a probabilidade de colisão desprezível. No modo monotônico, colisões dentro de uma mesma execução são impossíveis por construção, já que cada valor é o anterior incrementado.
ULIDs em minúsculas são válidos?
A forma canônica é em maiúsculas, e é essa que você deve armazenar e comparar. A decodificação Crockford Base32 não diferencia maiúsculas de minúsculas, então minúsculas são lidas normalmente, mas misturar caixas em uma coluna do banco é um jeito fácil de acabar com duas linhas que são o mesmo identificador para uma pessoa e diferentes para o índice.
Como devo armazená-los em um banco de dados?
Como 16 bytes crus quando o banco tiver um tipo binário de tamanho fixo ou um tipo UUID: é metade do espaço da forma em texto de 26 caracteres e mantém as comparações baratas. Armazene como texto só quando precisar que o id seja legível direto nos resultados das consultas.
Estes são gerados em um servidor?
Não. São gerados no seu navegador pelo JavaScript desta página, usando o gerador de números aleatórios criptográfico integrado. Nada é transmitido ou armazenado em lugar nenhum.