Pular para o conteúdo principal

UUID vs NanoID

Os dois geram identificadores que permanecem únicos sem autoridade central. UUIDs são o padrão: 36 caracteres, RFC 9562, embutidos em todo runtime e banco de dados. NanoIDs são a alternativa compacta — 21 caracteres seguros para URL com entropia comparável. Prefira UUIDs por padrão para chaves e infraestrutura; recorra ao NanoID quando o ID aparecer em URLs.

Só local

UUID vs NanoID: explicação

Todo sistema distribuído precisa de identificadores que duas máquinas possam criar no mesmo momento sem se consultar. Os UUIDs resolveram isso nos anos 1980, padronizados como RFC 4122 e revisados em 2024 como RFC 9562; o NanoID chegou em 2017 como uma biblioteca mínima atrás de strings mais curtas. Os dois são imunes a colisões pela mesma matemática — bastantes bits aleatórios — e nenhum precisa de um servidor de coordenação.

Um UUID são 128 bits representados em 36 caracteres: 32 dígitos hexadecimais no padrão 8-4-4-4-12, seis deles gastos com marcadores de versão e variante, então a versão 4 carrega 122 bits aleatórios. Um NanoID padrão tem 21 caracteres sorteados de A-Za-z0-9_- — 64 símbolos de 6 bits cada, 126 bits aleatórios, via crypto.getRandomValues. Formas diferentes, mesmo patamar de colisão.

As diferenças reais são operacionais: quem pode produzir e validar cada forma, como os IDs se comportam dentro de índices de banco de dados, como ficam em uma URL e quão reversível é a escolha — tudo medido abaixo, com um gerador local linkado ao longo do texto para comparar saída real.

Quer ver as duas formas em saída real? O gerador de UUID roda inteiramente no seu navegador — crypto.getRandomValues, sem chamadas de rede, nada registrado.

Para o tour completo do que cada versão codifica, o guia de versões do UUID percorre da v1 até a v8 com exemplos resolvidos.

Anatomia: o que existe dentro de cada ID

Os UUIDs codificam seus próprios metadados. Os bits 48–51 guardam a versão — 1 para tempo mais MAC, 4 para aleatório, 7 para aleatório ordenado por tempo — e dois bits adicionais fixam a variante. Um v4 sempre parece aleatório; um v7 começa com um timestamp legível, porque seus primeiros 48 bits são milissegundos desde a época Unix, e UUIDs cunhados no mesmo dia compartilham um prefixo.

Os NanoIDs não carregam metadados. Cada caractere é um sorteio independente do alfabeto, escolhido com mascaramento e amostragem por rejeição sobre o crypto.getRandomValues, para que cada símbolo permaneça igualmente provável. Essa pureza é o motivo de o formato ser flexível — mude o alfabeto ou o comprimento, mantenha o algoritmo — e de um NanoID não revelar nada sobre quando foi criado.

AspectoUUIDNanoID
Spec que regeRFC 9562 (2024, ex-RFC 4122)Convenção de biblioteca (nanoid) — sem RFC
Tamanho padrão36 caracteres, 128 bits21 caracteres, 126 bits
Alfabeto0-9a-f mais 4 hifensA-Za-z0-9_- (64 símbolos)
Fonte de aleatoriedadeCSPRNG; crypto.randomUUID()crypto.getRandomValues com mascaramento
Timestamp embutidov1 e v7 sim; v4 nenhumNenhum — opaco por design
Entropia útil122 bits (v4); 74 bits aleatórios no v7126 bits em 21 caracteres

A matemática das colisões: por que nenhum dos dois colide

O limite do aniversário diz que um identificador aleatório de n bits atinge uma probabilidade de colisão de 50% perto de 2^(n/2) sorteios. Para o UUID v4, isso é aproximadamente 2^61 — cerca de 2.3 quintilhões de IDs — antes de as chances de um único duplicado chegarem à metade; os 126 bits do NanoID empurram o patamar um pouco além. Na prática, os dois são sistemas de nunca-acontece — qualquer duplicado que você encontrar é um bug de código, não um evento de entropia.

Essa equivalência é o motivo de o debate sobre tamanho importar menos do que se assume: 21 caracteres de NanoID não são mais seguros que um UUID v4 — a mesma garantia em menos bytes. Os motivos honestos para escolher são encaixe operacional — armazenamento, URLs, ferramentas — não risco de colisão.

Bancos de dados: o problema da localidade de índice

Insira uma chave aleatória em um índice B-tree e a linha pode cair em qualquer página; preencha páginas pela metade em ordem aleatória e cada inserção arrisca um page split, escritas extras e um cache mais frio. Esse é o imposto de fragmentação que tanto o UUID v4 quanto o NanoID pagam — NanoID incluído, porque é igualmente aleatório. Em uma chave primária indexada em escala de escrita intensa, nenhum dos dois é amigável ao índice por padrão.

O UUID v7 é a correção que já vem dentro do padrão: seus 48 bits iniciais são um timestamp em milissegundos, então as chaves novas quase sempre se ordenam na borda direita do índice. O NanoID não pode oferecer isso: sem componente de tempo, nada pelo qual ordenar. Em uma coluna indexada, a escolha real é v7 contra todo o resto.

  • v4 e NanoID espalham inserções pela árvore — page splits e cache misses em escala.
  • O tipo uuid do Postgres armazena 16 bytes brutos; uma chave de texto de 36 caracteres armazena 37 ou mais.
  • A vantagem textual do NanoID — 21 caracteres contra 36 — vale apenas enquanto o alfabeto permanece documentado.

URLs, alfabetos e o seletor de comprimento

O alfabeto do NanoID é seguro para URL por construção: A-Za-z0-9_- não precisam de percent-encoding em nenhum ponto de uma URL, então um ID pode ser um segmento de caminho, valor de query ou slug sem nenhum escape. UUIDs são tecnicamente seguros para URL também — dígitos hexadecimais e hifens nunca precisam de codificação — mas 36 caracteres é muita string visível para um link.

O alfabeto personalizado é o recurso mais prático do NanoID: códigos só com números, links curtos em minúsculas — troque os 64 símbolos, mantenha o algoritmo. Respeite a regra de que a entropia é o comprimento vezes o log2 do tamanho do alfabeto: um NanoID minúsculo de 8 caracteres tem cerca de 38 bits, ok para um código de uma hora, imprudente como chave primária. UUIDs não oferecem esse seletor; o formato é fixo em 128 bits.

Quando escolher cada um

Escolha UUIDs quando o ID vive na infraestrutura: chaves primárias de banco de dados (v7), intercâmbio entre equipes e fornecedores, qualquer coisa que um terceiro precise validar, qualquer lugar em que um recurso embutido vença uma dependência. O padrão é o produto — toda linguagem, ORM e banco de dados já o fala.

Escolha NanoID quando o ID é visível para o usuário: URLs curtas, links de convite, nomes de arquivo, valores de cookie, IDs de requisição em logs. A orientação se inverte com clareza — se você vive brigando com a largura de um UUID dentro de uma URL, esse link quer NanoID; se você se pega reimplementando NanoID em um backend cujo banco de dados poderia servir chaves nativamente, essa coluna quer um UUID v7.

Perguntas frequentes

Posso gerar UUIDs ou NanoIDs aqui sem que nada seja enviado a um servidor?

Sim. O gerador roda na sua aba usando o crypto.getRandomValues do próprio navegador, e nenhuma requisição sai da página — a Content-Security-Policy do site bloqueia chamadas de saída. Abra o painel Network do DevTools enquanto gera e veja-o ficar em silêncio. A aleatoriedade vem do seu sistema operacional via navegador, então a qualidade equivale à geração no servidor.

NanoIDs são tão seguros contra colisões quanto o UUID v4?

Um pouco mais, em bits brutos: 126 contra os 122 do v4. O ponto de colisão de 50% fica um pouco depois de 2^61 sorteios (cerca de 2.3 quintilhões de IDs para o v4), muito além de qualquer volume realista. A diferença só se torna pensável quando você reduz o comprimento ou o alfabeto do NanoID.

Devo usar NanoID como chave primária de banco de dados?

Você pode — mas uma chave de texto de 21 caracteres é tão aleatória quanto o v4, então herda a mesma fragmentação de B-tree em tabelas de escrita intensa. Se as inserções são quentes, o UUID v7 — ordenado por tempo — é a escolha amigável ao índice. O NanoID compra strings mais curtas, não localidade de índice.

NanoID é um padrão como o UUID?

Não. UUID é a RFC 9562 com suporte nativo em toda linguagem, no tipo uuid do Postgres e no crypto.randomUUID(). NanoID é uma convenção de biblioteca: pequeno o bastante para reimplementar em minutos, mas todo produtor e consumidor precisa concordar sobre alfabeto e comprimento, e nada valida a conformidade. Esse acordo é o preço dos 15 caracteres economizados.

Por que o UUID v7 é recomendado em vez do v1?

O campo node do v1 carrega o endereço MAC da máquina, o que vaza identidade de hardware e liga IDs entre sistemas, e seu timestamp gregoriano de 100 nanossegundos se ordena de forma estranha contra ferramentas de tempo Unix. O v7 substitui os dois por 48 bits de milissegundos Unix mais bits aleatórios: ordenável por tempo, neutro em privacidade, mesma RFC. Comece designs novos no v7 ou v4.

Quão curto um NanoID pode ficar antes de colisões importarem?

A entropia é caracteres vezes o log2 do tamanho do alfabeto; divida o expoente pela metade para o limite do aniversário. Os 21 caracteres padrão são 126 bits. Doze caracteres são 72 bits, cerca de 2^36 sorteios até um cara-ou-coroa — ok por usuário, fraco para uma tabela global. Oito são aproximadamente 48 bits: códigos de vida curta, nunca chaves primárias.

Onde posso ler os padrões citados aqui?

  • RFC 9562 — Identificadores únicos universais (UUIDs)
  • RFC 4122 — Namespace URN para identificadores únicos universais (UUID) (substituída pela RFC 9562)