O que é um UUID

Um UUID (Universally Unique Identifier, também chamado de GUID) é um valor de 128 bits usado para identificar alguma coisa, seja uma linha, uma requisição ou um arquivo, sem precisar combinar nada com ninguém. A promessa está no nome: dois UUIDs gerados de forma independente, para todos os efeitos práticos, nunca são iguais. Isso permite que serviços separados, dispositivos offline e processos paralelos gerem identificadores que não vão colidir quando os dados forem juntados mais tarde, sem um alocador central distribuindo números.

Um UUID é escrito como 32 dígitos hexadecimais, em cinco grupos separados por hífen: 8-4-4-4-12, por exemplo 550e8400-e29b-41d4-a716-446655440000. Duas posições específicas não são aleatórias: um nibble (meio byte) de versão indica como o UUID foi gerado, e um campo de variante marca o padrão de layout (o atual é o da 4122 / RFC 9562).

Versão 4: aleatória

A forma de longe mais comum, a versão 4, é quase toda aleatória: 122 dos 128 bits vêm de uma fonte aleatória segura, e os bits restantes ficam fixos para marcar a versão e a variante. Com tanta entropia, a chance de dois UUIDs v4 colidirem é desprezível para qualquer volume realista de identificadores.

O ponto fraco dela não é a unicidade, e sim a ordenação. Como os valores v4 são aleatórios, inserções consecutivas se espalham por todo o espaço de chaves. Quando um UUID v4 é usado como chave primária num banco de dados, essa aleatoriedade trabalha contra o índice B-tree: as linhas novas caem em lugares arbitrários, o que prejudica a localidade de cache e fragmenta o índice com o tempo.

Versão 7: ordenada por tempo

A versão 7, padronizada na RFC 9562 (2024), foi criada para resolver exatamente isso. Ela coloca nos bits mais significativos um timestamp de 48 bits em milissegundos (um carimbo de data e hora), seguido de bits aleatórios que garantem a unicidade dentro do mesmo milissegundo. Como o timestamp vem na frente, os UUIDs v7 ficam em ordem de criação quando comparados como texto ou como bytes.

Essa propriedade, sozinha, faz do v7 uma chave primária muito melhor: as linhas novas entram perto do fim do índice em vez de se espalhar, o que devolve a localidade que as chaves inteiras sequenciais têm, sem perder a unicidade descentralizada de um UUID. Um valor v7 também carrega o seu próprio horário de criação, que dá para ler direto daqueles bits iniciais; a ferramenta de UUID faz isso quando você inspeciona um valor.

As outras versões, em resumo

Para completar: a versão 1 combina um timestamp com o endereço MAC (media access control) da máquina que gerou o UUID, o que expõe a identidade do hardware e o horário de criação e, por isso, levanta questões de privacidade. As versões 3 e 5 são baseadas em nome: elas aplicam um hash a um namespace mais um nome (com e -1, respectivamente) para produzir um UUID determinístico, útil quando a mesma entrada precisa gerar sempre o mesmo identificador. A versão 6 reorganiza os campos da versão 1 para que fiquem ordenáveis, mas, para sistemas novos, a escolha recomendada com ordenação por tempo é o v7.

Qual escolher

Use o v4 quando você só precisa de um identificador aleatório e opaco e a ordem não importa. Use o v7 quando o UUID for uma chave de banco de dados, ou qualquer outra coisa que ganhe com a ordenação por horário de criação, que é cada vez mais a recomendação padrão. A ferramenta de UUID gera os dois e decodifica a versão, a variante e o timestamp embutido de qualquer UUID que você colar, tudo dentro do seu navegador.

Esta série, em ordem

Este artigo abre a série Identificadores: UUIDs e afins. Ele compara as duas versões entre as quais a maioria dos sistemas escolhe; as partes seguintes completam a família, fazem as contas da colisão, medem o custo de uma chave aleatória num índice e colocam os outros formatos ordenáveis lado a lado com o UUIDv7.

  1. Versões de UUID: o que muda da v1 à v8. A família inteira, da v1 à v8, e como se leem os bits de versão e de variante.
  2. UUIDs vão colidir? Probabilidade e o limite do aniversário. Quantos bits aleatórios um UUID tem de verdade, o limite do aniversário e quando um UUID determinístico é a melhor escolha.
  3. UUIDs como chaves de banco de dados: v4, v7 e localidade de índice. UUIDs versus inteiros com autoincremento, e por que chaves v4 aleatórias deixam um índice mais lento sem ninguém perceber.
  4. ULID, KSUID, Snowflake e outros IDs ordenáveis. , KSUID e Snowflake, como cada um é montado e quanto do papel deles o UUIDv7 já cobre.