Versões de UUID
Um UUID é um identificador de 128 bits escrito como 32 dígitos hexadecimais em grupos 8-4-4-4-12, padronizado na RFC 9562. O nibble de versão revela como ele foi criado: v1 e v6 a partir de um relógio, v3 e v5 a partir de um hash de nome, v4 a partir de aleatoriedade, v7 a partir de um timestamp Unix mais aleatoriedade — cada um com compromissos diferentes de ordenação e privacidade.
Versões de UUID: explicação
Dois sistemas que nunca se conheceram precisam nomear uma linha, uma requisição ou um arquivo sem perguntar a ninguém. Esse é o problema que os UUIDs resolvem: gere um identificador a partir de informação local — um relógio, bits aleatórios, um nome — e as chances de outra pessoa gerar o mesmo valor são pequenas o bastante para se planejar em torno delas. Nenhum serviço de coordenação, nenhum contador compartilhado para disputar, nenhum registro central para consultar.
O padrão atual é a RFC 9562, publicada em maio de 2024 como sucessora da RFC 4122, e sua mudança principal é o status oficial de duas versões mais novas: v6 e v7. A versão fica no nibble mais significativo do terceiro grupo — o primeiro dígito hexadecimal depois do segundo hífen — e os bits de variante abrem o quarto grupo. Ler esses dois dígitos revela a procedência de um UUID num relance.
Este guia explica o layout de bits de cada versão, no que ela é boa e onde sua honestidade termina — incluindo o custo de privacidade do endereço MAC embutido no v1 e a matemática de colisões por trás do v4. O gerador vinculado abaixo produz várias versões localmente, para você inspecionar o padrão na sua própria máquina.
Cada layout abaixo é mais fácil de ler a partir de um espécime real — o Gerador de UUID produz identificadores v4 e v7 no seu navegador, e nada do que ele gera fica registrado ou é enviado a lugar algum.
Identificadores também viajam dentro de tokens; o guia sobre a estrutura do JWT mostra onde um claim jti carrega um UUID e por que o token em volta dele é assinado, mas não é secreto.
Anatomia: 128 bits em 36 caracteres
Um UUID tem 128 bits, escritos canonicamente como 32 dígitos hexadecimais minúsculos em cinco grupos separados por hífens no padrão 8-4-4-4-12 — 36 caracteres com os hífens, 32 sem. O layout não é decoração: faixas de bits específicas carregam significado. O campo de versão de quatro bits ocupa o nibble superior do terceiro grupo, e a variante de dois bits — que distingue UUIDs no estilo RFC de layouts mais antigos da Microsoft e legados — ocupa os bits superiores do quarto grupo, sempre lendo 8, 9, a ou b em hexadecimal.
| Grupo | Dígitos de exemplo | Conteúdo (mostrado para um v1) |
|---|---|---|
| 1 | 614e4000 | time_low — os bits menos significativos do timestamp |
| 2 | 26bc | time_mid — os bits intermediários do timestamp |
| 3 | 11ef | 12 bits de timestamp e, depois, a versão de 4 bits — o 1 significa v1 |
| 4 | b17d | variante de 2 bits (binário 10) e, depois, 14 bits de sequência de relógio |
| 5 | 0242ac120002 | 48 bits de nó — no v1, o endereço MAC da máquina geradora |
Quatro versões, um relance
v1 614e4000-26bc-11ef-b17d-0242ac120002 v4 f7b17bde-5a0c-4174-8c95-407558615543 v6 1ec9414c-232a-6b00-b3c8-9e6bdeced846 v7 019b76da-a800-7c3e-8f2a-5b6c7d8e9f0a
Onde olhar
3rd group, 1st hex digit = version (1, 4, 6, 7 here) 4th group, 1st hex digit = variant (b, 8, b, 8 here)
v1 e v6: um relógio e um endereço MAC
O v1 constrói o identificador a partir de um timestamp de 60 bits que conta intervalos de 100 nanossegundos desde 15 de outubro de 1582 — o início do calendário gregoriano — mais um contador de sequência de relógio e o endereço MAC de 48 bits da máquina. O timestamp é dividido de forma nada óbvia em time_low, time_mid, time_high, uma ordem de campos escolhida por uma conveniência de empacotamento de bits dos anos 1990 e depois lamentada. O endereço MAC é a mina terrestre da privacidade: todo UUID v1 revela qual hardware o criou, e é por isso que a RFC 4122 já permitia substituí-lo por um nó multicast aleatório.
O v6 é o v1 com a ordem dos campos corrigida: os bits de timestamp mais significativos vão para a frente, de modo que UUIDs v6 se ordenem cronologicamente quando ordenados como strings. Mesmo relógio, mesmo campo de nó, mesmas ressalvas de privacidade — mas um comportamento de banco de dados muito melhor, que é exatamente o objetivo da reordenação.
O mesmo timestamp, duas ordens de campos
v1: 614e4000-26bc-11ef-b17d-0242ac120002 v6: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
O que se ordena corretamente em um índice de strings
v6 — o campo timeHigh vem primeiro, então a ordem lexicográfica é a ordem cronológica. v1 começa pelos bits menos significativos e se dispersa.
v3 e v5: identidade a partir de um nome
O v3 e o v5 derivam o identificador de um UUID de namespace e de um nome, com hash MD5 (v3) ou SHA-1 (v5). Mesmo namespace, mesmo nome, mesmo UUID — em qualquer máquina, para sempre. Esse determinismo é a funcionalidade: derive identificadores estáveis de URLs, nomes de usuário ou nomes de domínio sem armazenar uma tabela de mapeamento, e regenere-os quando quiser, em qualquer sistema.
O custo é o outro lado do determinismo: o identificador vaza informação sobre o nome. Um v5 de um nome de baixa entropia pode ser confirmado por simples adivinhação, e nomes idênticos produzem identificadores idênticos de propósito. O v5 substitui o v3 — SHA-1 em vez de MD5 — e, embora a RFC 9562 não nomeie nenhuma versão nova baseada em nome, novos designs que querem determinismo e ordenação temporal ao mesmo tempo costumam migrar para o v7, armazenando o nome ao lado.
Determinístico: mesma entrada, mesma saída
namespace: DNS 6ba7b810-9dad-11d1-80b4-00c04fd430c8 name: python.org v3 6fa459ea-ee8a-3ca4-894e-db77e160355e v5 886313e1-3b8a-5372-9b90-0c9aee199e5d
Por que se reproduz em qualquer lugar
hash(namespace bytes || "python.org") com a versão (3 ou 5) e a variante (binário 10) gravadas em posições de bits fixas — o mesmo cálculo, bit a bit.
v4: 122 bits aleatórios e o que isso compra
O v4 define 122 bits a partir de um gerador aleatório criptograficamente seguro; só os nibbles de versão e variante são fixos. As chances de colisão seguem o limite do aniversário: após gerar n valores, a probabilidade de qualquer duplicata é de aproximadamente n²/2¹²³. Você precisaria de cerca de 2^61 UUIDs — uns 2,3 quintilhões — para haver uma chance de cara ou coroa de uma única colisão. Quando duplicatas aparecem na prática, a causa é quase sempre aleatoriedade quebrada — uma semente fraca, estado de PRNG reutilizado, uma falha de hardware — jamais as próprias probabilidades.
A aleatoriedade também é a fraqueza do v4 como chave de banco de dados: valores completamente fora de ordem caem em páginas aleatórias da B-tree, fragmentando índices e esgotando caches de escrita em escala. Essa reclamação é precisamente o que o v6 e o v7 foram padronizados para resolver, e o motivo pelo qual muitos ORMs e bancos de dados distribuídos hoje direcionam tabelas novas para o v7.
v7: milissegundos Unix mais aleatoriedade
O v7 é o candidato a padrão moderno: 48 bits de timestamp Unix em milissegundos e, depois, 12 mais 62 bits de carga aleatória. O timestamp na frente torna os UUIDs v7 ordenáveis como strings — amigáveis a índices justamente nos bancos de dados que os armazenam — enquanto os 74 bits aleatórios mantêm as chances de colisão efetivamente no nível do v4. Ele não precisa de endereço MAC, de época 1582 nem de conversões de calendário.
Dentro do mesmo milissegundo, a RFC 9562 descreve um contador monótono no campo rand_a, para que identificadores criados em rápida sucessão continuem aumentando — uma propriedade com a qual chaves primárias se importam ainda mais do que com unicidade bruta. O timestamp também é legível: ele se lê como 2026, não como uma contagem de tiques de 100 nanossegundos desde 1582, o que torna o v7 agradável de bater o olho em logs e resultados de consulta.
Ordenado no tempo por construção
2026-01-01T00:00:00Z 019b76da-a800-7c3e-8f2a-5b6c7d8e9f0a 2026-01-01T00:00:01Z 019b76da-abe8-9d41-8c2f-4a5b6c7d8e9f
Ordenado como strings, ordenado no tempo
019b76da-a800-… < 019b76da-abe8-… a ordem lexicográfica acompanha a cronologia, e os 48 bits superiores são um timestamp Unix em ms.
Escolhendo uma versão, com honestidade
Para trabalhos novos: v7 quando os identificadores devem se ordenar por tempo ou viver em um índice de banco de dados; v4 nos demais casos — ambos não precisam de coordenação e não vazam nada sobre sua origem. O v5 justifica sua existência quando o identificador precisa ser reproduzível a partir de um nome. O v1 e o v6 continuam suportados, mas vazam identidade de hardware a menos que o gerador randomize o campo de nó; e o v3 é o legado MD5 levado adiante por compatibilidade. Nenhuma versão é secreta, e nenhuma anonimiza dados: um UUID é um nome, não uma credencial.
| Versão | Origem dos bits | Ordenável como string | Fique atento a |
|---|---|---|---|
| v1 | timestamp gregoriano + sequência de relógio + nó MAC | Não | Vazamento do endereço MAC |
| v3 | MD5 de namespace + nome | Não | Legado MD5; nomes adivinháveis |
| v4 | 122 bits aleatórios | Não | A ordem de inserção aleatória fragmenta índices |
| v5 | SHA-1 de namespace + nome | Não | Determinístico — nomes confirmáveis por adivinhação |
| v6 | v1 reordenado para ordenabilidade | Sim | Mesma ressalva de MAC que o v1 |
| v7 | timestamp Unix em ms + 74 bits aleatórios | Sim | Empates no mesmo milissegundo sem contador monótono |
Perguntas frequentes
Os UUIDs gerados neste site ficam registrados em algum lugar?
Não. O gerador cria identificadores com a API de aleatoriedade do seu próprio navegador, dentro da aba — não há etapa de envio nem registro no servidor, porque o código nunca envia uma requisição. Você pode ver o painel Network ficar em silêncio enquanto ele trabalha, e a Content-Security-Policy do site bloqueia conexões de saída durante toda a vida da página.
Dois UUIDs podem colidir na prática?
Para o v4, o limite do aniversário coloca a chance de cara ou coroa de uma duplicata em cerca de 2^61 valores gerados — aproximadamente 2,3 quintilhões. Colisões reais quase sempre indicam aleatoriedade quebrada, e não azar: uma semente fraca, estado de PRNG reutilizado ou uma falha de RNG de hardware. O v3 e o v5 'colidem' de propósito — o mesmo nome no mesmo namespace produz o mesmo UUID por design.
Por que alguns UUIDs se ordenam mal como chaves primárias de banco de dados?
As versões aleatórias (v4) espalham as linhas novas por um índice B-tree, gravando em páginas imprevisíveis e castigando o cache à medida que a tabela cresce. As versões ordenadas no tempo (v6, v7) acrescentam perto da borda direita do índice. Se você está comprometido com chaves v4, os remédios padrão são uma coluna de clustering separada, ordenada no tempo, ou mover as linhas novas para o v7.
Um UUID é secreto ou anônimo?
Nenhum dos dois. Um UUID é um identificador, não uma credencial: ele não traz prova de quem o possui, e um v1 até transmite o endereço MAC da máquina geradora, a menos que o campo de nó tenha sido randomizado. Trate os UUIDs como nomes — seguros para registrar em logs, úteis para correlacionar — e coloque autenticação e autorização em mecanismos que de fato conseguem verificar algo.
Qual é a diferença entre um GUID e um UUID?
Eles nomeiam a mesma família de identificadores de 128 bits; GUID é o termo da Microsoft. A diferença técnica está nos bits de variante no início do quarto grupo, que distinguem os UUIDs no estilo RFC (binário 10 — primeiro dígito hexadecimal 8, 9, a ou b) dos layouts mais antigos da Microsoft e legados. GUIDs modernos são gerados como variantes RFC, e é por isso que os dois termos são usados como sinônimos na maioria das documentações.
Por que o timestamp do v1 começa em 1582?
O contador de 60 bits avança em intervalos de 100 nanossegundos a partir da reforma do calendário gregoriano, em 15 de outubro de 1582 — escolhida para que o contador começasse distante o bastante no passado e não estoure por milênios. O preço é a legibilidade: um timestamp v1 não significa nada sem um conversor. Os milissegundos Unix do v7 foram escolhidos em parte porque se leem diretamente como datas.
Onde posso ler os padrões citados aqui?
Quais ferramentas relacionadas devo usar a seguir?
- Gerar UUIDGera v4, v7 e v1 em lote e inspeciona UUIDs existentesAbrir
- Estrutura de um JWTGuia em linguagem simplesAbrir
- Como funciona o Base64Guia em linguagem simplesAbrir
- O que é JSONGuia em linguagem simplesAbrir
- Ferramentas JSONCompare, formate, valide e explore documentos JSON.Abrir
- Formatar JSONIndenta, ordena chaves e remove comentáriosAbrir