UUID v4 vs v7: que identificador único escolher?
Um UUID é um identificador de 128 bits único sem coordenação central. A versão 4, totalmente aleatória, domina há anos. A versão 7, mais recente (RFC 9562, 2024), integra um carimbo temporal no início para produzir identificadores ordenados no tempo. Esta diferença, aparentemente inócua, altera radicalmente o desempenho na base de dados. Eis qual escolher.
O que é um UUID?
Um UUID (Universally Unique Identifier) é um número de 128 bits representado por 32 caracteres hexadecimais agrupados em cinco blocos, por exemplo 550e8400-e29b-41d4-a716-446655440000. A sua razão de ser: gerar um identificador único sem pedir a uma autoridade central, o que o torna ideal para os sistemas distribuídos. Pode gerar alguns com o nosso gerador de UUID.
Existem várias versões; as mais pertinentes hoje para chaves de registo são a v4 (aleatória) e a v7 (ordenada no tempo).
UUID v4 (aleatório)
O UUID v4 é constituído por 122 bits aleatórios (o resto codifica a versão e o variant). A probabilidade de colisão é tão reduzida que é negligenciável na prática. É a versão por omissão na maioria das linguagens e bibliotecas.
- Imprevisível: perfeito para tokens ou identificadores públicos que não se querem adivinháveis
- Nenhuma fuga de informação: não revela data nem ordem de criação
- Inconveniente: totalmente desordenado, o que maltrata os índices de base de dados
UUID v7 (ordenado no tempo)
O UUID v7 coloca um carimbo temporal Unix em milissegundos nos seus primeiros 48 bits, seguido de bits aleatórios. Dois UUID v7 gerados em instantes diferentes ordenam-se assim pela ordem da sua criação, mantendo-se únicos e praticamente impossíveis de adivinhar.
- Ordenável: a ordem lexicográfica corresponde à ordem cronológica
- Amigável para os índices: as inserções fazem-se no fim do índice, como um auto-incremento
- Contrapartida: revela o instante de criação, o que pode ser indesejável para um identificador público
Tabela comparativa
| Critério | UUID v4 | UUID v7 |
|---|---|---|
| Composição | 122 bits aleatórios | Carimbo temporal + aleatório |
| Ordenado no tempo | Não | Sim |
| Ordenável | Não | Sim (cronológico) |
| Desempenho de índice | Fraco (fragmentação) | Elevado (inserções sequenciais) |
| Imprevisibilidade | Total | Elevada mas revela o instante |
| Fuga de informação | Nenhuma | Data de criação |
| Maturidade / suporte | Universal | Recente (RFC 9562, 2024) |
Impacto nas bases de dados
É o cerne do assunto. As bases relacionais armazenam os seus índices em árvores B (B-tree). Inserir chaves aleatórias (v4) dispersa as escritas por todo o índice, provocando fragmentação, divisões de páginas e uma cache menos eficaz. Em grandes volumes, o desempenho de inserção degrada-se nitidamente.
As chaves ordenadas (v7) inserem-se sempre no fim do índice, como um identificador auto-incrementado. Recuperam-se inserções rápidas, melhor localidade e um índice mais compacto. É particularmente nítido com uma chave primária em InnoDB (MySQL), em que a chave primária determina a ordem física das linhas.
Quando escolher um ou outro
Escolher UUID v4 quando
- O identificador é exposto publicamente e não deve revelar nada
- Gera tokens, ligações de partilha, segredos
- A ordem e a data de criação não devem ser adivinháveis
- Pretende uma compatibilidade máxima com o existente
Escolher UUID v7 quando
- O UUID serve de chave primária numa base de dados
- O volume de inserções é elevado e o desempenho de índice conta
- Pretende ordenar por ordem de criação sem coluna dedicada
- Revelar o instante de criação não é um problema
Recomendação
Para uma chave primária de base de dados, prefira doravante UUID v7: mantém a unicidade distribuída do UUID evitando a penalização de índice da v4. Conserve UUID v4 para os identificadores públicos, tokens e segredos, em que a imprevisibilidade total e a ausência de fuga temporal prevalecem.
Verifique ainda assim o suporte da v7 na sua linguagem e no seu ORM: a RFC é recente, mas a adoção progride depressa.
Perguntas frequentes
O UUID v7 é menos seguro do que o v4?
Continua a ser muito difícil de adivinhar graças aos seus bits aleatórios, mas revela o instante de criação através do seu carimbo temporal. Para um identificador público em que a data não deve vazar, ou um segredo, prefira a v4.
Porque é que o UUID v4 abranda as bases de dados?
Porque os seus valores aleatórios dispersam as inserções por todo o índice B-tree, o que fragmenta as páginas e reduz a eficácia da cache. A v7, ordenada, insere no fim do índice e evita este problema.
Posso migrar de v4 para v7?
Sim para os novos registos: ambos os formatos coexistem na mesma coluna UUID. Não é preciso reescrever o histórico; basta mudar a geração das novas chaves para a v7.
E quanto às versões v1 e v6?
A v1 codifica o carimbo temporal e o endereço MAC, o que coloca problemas de confidencialidade. A v6 reordena a v1 para a tornar ordenável. Para um novo projeto, a v7 é a versão ordenada recomendada pela RFC 9562.