Um formato, várias receitas
Um UUID (universally unique identifier, ou identificador universalmente único) tem sempre o mesmo formato: 128 bits, escritos como 32 dígitos hexadecimais naquele agrupamento conhecido, 8-4-4-4-12. O que muda de uma versão para outra é a forma de gerar esses bits. O padrão atual é a 9562, publicada em 2024 para substituir a RFC 4122, que valeu por muitos anos. Ela define as versões 1 a 8, cada uma com uma estratégia diferente para preencher os 128 bits de um jeito que continue único sem depender de uma autoridade central. A visão geral de UUID se concentra nas duas que você mais vai usar, a v4 e a v7; este artigo mapeia a família inteira, para você reconhecer qualquer uma delas e saber escolher.
Como o UUID informa a própria versão
Dois campos pequenos são reservados em qualquer versão, e a ferramenta lê os dois. A versão fica em quatro bits (o primeiro dígito hexadecimal do terceiro grupo): um 4 ali indica um UUID v4, e um 7 indica v7. A variante fica nos bits mais altos do grupo seguinte (na variante padrão, o primeiro dígito hexadecimal do quarto grupo costuma ser 8, 9, a ou b). Juntos, esses dois campos dizem a quem lê como interpretar o resto dos bits, e é por isso que uma ferramenta consegue identificar a versão de um UUID só de olhar para ele, sem nenhum contexto.
As versões baseadas em tempo: v1, v6, v7
Três versões trazem um timestamp, o que as deixa mais ou menos em ordem cronológica, uma propriedade útil para chaves de banco de dados (veja o artigo sobre chaves de banco de dados):
- A versão 1 combina um timestamp de 60 bits com uma sequência de relógio (clock sequence) e um identificador de nó, e o nó, tradicionalmente, é o endereço MAC da máquina. Funciona, mas expõe o MAC e o horário em que o UUID foi gerado, e a ordem dos campos do timestamp não fica certa quando você ordena os UUIDs como texto.
- A versão 6 é a v1 com os campos do timestamp reorganizados para que os bytes fiquem em ordem cronológica. Ela existe como uma melhoria que entra direto no lugar da anterior, para sistemas que já usam v1 e querem poder ordenar.
- A versão 7 usa um timestamp simples, em milissegundos, seguido de bits aleatórios. É a recomendação atual para novos identificadores ordenados no tempo: dá para ordenar, não expõe nada do hardware e é simples. Na maioria dos projetos novos que precisam de chaves ordenadas, a resposta é a v7.
As versões baseadas em nome: v3 e v5
As versões 3 e 5 são determinísticas: a mesma entrada gera sempre o mesmo UUID. Você calcula o hash de um identificador de namespace junto com um nome, e o resultado do hash vira o UUID. A versão 3 usa e a versão 5 usa -1; a v5 é a preferida porque o SHA-1, embora aqui não esteja sendo usado por segurança, é a escolha menos frágil. São essas as versões certas quando você precisa de um identificador estável derivado de dados que já existem, por exemplo um UUID que seja sempre o mesmo para uma determinada URL ou nome de arquivo, de modo que dois sistemas cheguem ao mesmo valor, cada um por conta própria.
A versão aleatória: v4
A versão 4 preenche 122 bits com valores aleatórios (os outros 6 são os bits fixos de versão e variante). Ela não traz timestamp, nem MAC, nem estrutura nenhuma, e por isso é a escolha padrão segura quando você só quer um identificador opaco e resistente a colisões e não se importa com ordem. A única desvantagem é justamente essa falta de ordem: é ela que prejudica a localidade dos índices no banco de dados, e foi ela que motivou a v7. Na ferramenta, a geração de v4 usa uma fonte de aleatoriedade criptograficamente segura no seu navegador, então os valores nunca passam por um servidor.
A versão 8 e os UUIDs especiais
A versão 8 é reservada para uso personalizado ou experimental: só os bits de versão e variante são fixos, e o resto você define como quiser. Assim, um sistema pode codificar os próprios dados no formato de UUID e continuar com um UUID válido. Há também dois valores especiais que vale reconhecer: o UUID nil, todo em zeros, e o UUID max, todo em uns, os dois usados como valores sentinela. A versão 2 existe por razões históricas (uma variante DCE Security), mas quase não aparece na prática e não é algo que você escolheria hoje.
Como escolher pelo objetivo
A família é grande, mas a escolha costuma ser rápida depois que você define o que precisa. Para um identificador opaco, impossível de adivinhar e sem ordem, use v4. Para um identificador estável, derivado de forma determinística de dados existentes, use v5. Para uma chave ordenada no tempo e boa para indexar, use v7. As versões antigas baseadas em tempo (v1, v6) servem, na maioria dos casos, para manter a compatibilidade com sistemas existentes, e a v8 está lá para quando você realmente precisa codificar uma estrutura própria. Quando você cola um UUID na ferramenta e ela mostra a versão, esse único dígito diz qual dessas receitas gerou o UUID.