Um UUID é um identificador de 128 bits que você pode gerar em qualquer lugar, sem registro central, e ainda assim confiar que será exclusivo. Mas nem todos os UUIDs são construídos da mesma maneira. Este guia explica as cinco versões que você realmente encontrará, por que a v7 está ganhando em chaves de banco de dados, como os UUIDs de namespace permanecem determinísticos e quão improvável é realmente uma colisão.
v4 vs v7 - aleatório vs ordenado por tempo
A versão 4 tem 122 bits de pura aleatoriedade, o que o torna o UUID mais simples e mais amplamente suportado. Sua fraqueza aparece em escala: como os valores são desordenados, a inserção de chaves v4 em um índice de banco de dados dispersa as gravações em toda a árvore B, causando divisões de página e falhas de cache.
A versão 7 corrige isso colocando um carimbo de data/hora Unix de milissegundos de 48 bits nos bits altos. O resultado ainda tem bastante aleatoriedade para exclusividade, mas UUIDs consecutivos compartilham um prefixo inicial, portanto, novas linhas são anexadas próximas umas das outras. Isso mantém os índices compactos e as inserções rápidas – e é por isso que a v7 é cada vez mais o padrão para novas chaves primárias.
UUIDs de namespace (v5 e v3)
As versões 5 e 3 são determinísticas. Você fornece a eles um UUID de namespace e um nome; eles concatenam os bytes e fazem hash deles - SHA-1 para v5, MD5 para v3 - e então extraem um UUID do resumo. As mesmas entradas sempre produzem o mesmo UUID, o que é perfeito para derivar um ID estável de algo que você já possui, como uma URL ou um caminho de arquivo.
Prefira v5 em vez de v3: SHA-1 é mais forte que MD5, e v3 existe principalmente para compatibilidade com sistemas mais antigos. A RFC 4122 fornece quatro namespaces padrão (DNS, URL, OID, X.500) e você pode definir o seu próprio fornecendo qualquer UUID como namespace.
Qual a probabilidade de uma colisão?
Com 122 bits aleatórios, a versão 4 extrai cerca de 5,3 × 1036 valores possíveis. Usando a aproximação do problema de aniversário, você precisaria gerar aproximadamente 2,71 × 1018 (2,71 quintilhões) de UUIDs antes de atingir até mesmo 50% de chance de uma única colisão - cerca de um bilhão de UUIDs a cada segundo durante 85 anos. mesmo milissegundo na mesma máquina. Para praticamente todas as aplicações, ambas as versões podem ser tratadas como livres de colisões.