Em resumo: UUID v4 é a escolha padrão segura para IDs únicos aleatórios, ULID é melhor quando você também quer IDs que se ordenam por data de criação, e NanoID é ideal quando precisa de IDs curtos e amigáveis para URLs. Os três evitam coordenação entre sistemas, mas equilibram de forma diferente comprimento, ordenação e comportamento nos índices. Este guia explica o que é cada um e quando usá-los.

Um identificador único permite que sistemas independentes criem registros sem perguntar a um servidor central «qual é o próximo número?». Essa independência é o ponto central: dois serviços, ou dois dispositivos offline, podem cunhar cada um um ID com a certeza de que os valores não colidirão.

O que é realmente um UUID

Um UUID é um valor de 128 bits, normalmente escrito como 36 caracteres — 32 dígitos hexadecimais mais quatro hifens, como 550e8400-e29b-41d4-a716-446655440000. A versão que você quase sempre quer é o UUID v4, que preenche 122 desses bits com aleatoriedade. Isso rende cerca de 5,3 × 10³⁶ valores possíveis, então uma colisão não é algo a prever: você precisaria gerar na ordem de um trilhão de bilhões de UUIDs antes que a probabilidade de um choque chegasse a 50 %.

«Desprezível» não é «impossível», mas na prática v4 oferece unicidade sem qualquer coordenação central.

UUID v4 versus v1

O UUID v1 é construído a partir de um carimbo de tempo mais o endereço de rede (MAC) da máquina geradora. Isso torna v1 aproximadamente ordenado no tempo, mas pode revelar onde e quando um ID foi criado — às vezes uma questão de privacidade. O UUID v4 abre mão de tudo isso em favor da pura aleatoriedade: sem ordem, sem metadados embutidos, nada a vazar. Para a maioria das aplicações v4 é o padrão certo, e v1 só compensa quando você quer especificamente seu componente temporal.

ULID: ordenável por design

Um ULID também tem 128 bits, mas é codificado como 26 caracteres Crockford base32 em vez de hexadecimal com hifens. Seus primeiros 48 bits são um carimbo de tempo em milissegundos e os 80 restantes são aleatórios. Como o carimbo vem primeiro, os ULIDs se ordenam lexicograficamente na ordem em que foram criados: ordene as strings e você tem a ordem cronológica de graça. É uma propriedade bem útil: barateia consultas «mais recentes primeiro» e mantém as inserções ordenadas em vez de espalhadas.

NanoID: curto e amigável para URLs

Um NanoID usa por padrão 21 caracteres de um alfabeto URL-safe, então entra num link sem percent-encoding. O comprimento é configurável, o que permite equilibrar tamanho e resistência a colisões: IDs mais curtos são mais limpos, mas deixam menos aleatoriedade, então mantenha-os mais longos para identificadores públicos ou de alto volume. NanoID brilha para links de compartilhamento, IDs públicos curtos e onde um UUID de 36 caracteres pareceria desajeitado numa URL.

Qual escolher para uma chave de banco de dados?

Aqui a escolha tem consequências reais de desempenho. UUID v4 é perfeitamente válido como chave primária, mas sua aleatoriedade faz as novas linhas se inserirem em posições aleatórias de um índice B-tree, causando fragmentação e mais divisões de página conforme a tabela cresce. Identificadores ordenados no tempo — ULID, ou o mais recente UUID v7 — inserem-se em ordem aproximadamente crescente, o que mantém o índice compacto e as escritas locais. Se você escolhe uma chave para uma tabela grande e com muitas escritas, prefira um ID ordenado no tempo; em tabelas pequenas a diferença raramente importa.

Erros comuns a evitar

  • Expor publicamente IDs inteiros sequenciais quando você queria IDs não adivinháveis — isso é tarefa de um ID aleatório, não de um auto-incremento.
  • Usar UUID v4 aleatório como chave agrupada de uma tabela enorme e depois estranhar as inserções lentas.
  • Truncar um UUID para «economizar espaço» — você joga fora a aleatoriedade que garante a unicidade.
  • Encurtar demais um NanoID para um identificador de alto volume e aumentar o risco de colisão.

Ajuste o ID à tarefa: use o Gerador de UUID para criar valores v4, v1, ULID ou NanoID, escolha v4 para a unicidade geral, ULID quando a ordem importa e NanoID quando o ID precisa viver numa URL.