Back

O UUID v4 é Realmente Único? (A Matemática Por Trás da Probabilidade)

Gerar identificadores únicos é um desafio fundamental no desenvolvimento de software.

Seja para chaves primárias de banco de dados, IDs de sessão ou rastreamento de transações, constantemente precisamos de uma maneira de identificar entidades de forma única.

O padrão mais amplamente adotado para isso é o UUID (Universally Unique Identifier).

Entre suas variantes, o UUID Versão 4, que é baseado em números aleatórios, é particularmente favorecido em sistemas distribuídos porque não requer coordenação central.

No entanto, todo desenvolvedor provavelmente já parou para se perguntar:

"Se é gerado aleatoriamente, não existe uma chance de colisão em algum lugar do mundo?"

Neste artigo, exploraremos a estrutura do UUID v4, a matemática por trás de sua probabilidade de colisão e os requisitos técnicos para gerá-lo com segurança.

1. Estrutura e Entropia do UUID v4

Um UUID é um número de 128 bits (16 bytes).

É tipicamente representado como uma string hexadecimal de 36 caracteres (incluindo hífens) como xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Para o UUID v4, bits específicos são reservados para indicar a versão e a variante:

  • Versão (4 bits): Indica a versão do UUID. Para v4, isso é fixado em 0100.
  • Variante (2 bits): Indica a variante de layout. Para a RFC 4122, isso começa com 10.

Portanto, subtrair esses 6 bits fixos do total de 128 bits nos deixa com 122 bits de pura entropia.

2. Prova Matemática de Unicidade

O número de combinações possíveis para 122 bits é 21222^{122}.

21225.3×10362^{122} \approx 5.3 \times 10^{36}

Isso é exatamente 5.316.911.983.139.663.491.615.228.241.121.378.304.

Para colocar esse número astronômico em perspectiva, vamos ver algumas comparações.

O Paradoxo do Aniversário

Usando a teoria da probabilidade conhecida como o "Paradoxo do Aniversário", podemos aproximar a probabilidade pp de uma colisão após gerar nn UUIDs:

p(n)1en22×2122p(n) \approx 1 - e^{-\frac{n^2}{2 \times 2^{122}}}

De acordo com esta fórmula:

  • Se você gerar 1 bilhão de UUIDs a cada segundo,
  • Você precisaria continuar por 85 anos para atingir uma probabilidade de 50% de uma única colisão.
  • Mesmo se cada pessoa na Terra tivesse 600 milhões de UUIDs cada, a chance de uma duplicata seria insignificante.

Em conclusão, a menos que estejamos falando de escalas cósmicas, preocupar-se com colisões de UUID v4 é praticamente desnecessário. As chances são menores do que ganhar na loteria várias vezes seguidas.

3. O Pré-requisito Crítico: CSPRNG

No entanto, essas probabilidades matemáticas são verdadeiras apenas se uma condição crucial for atendida: o uso de "números aleatórios imprevisíveis".

Funções de números aleatórios padrão em muitas linguagens de programação (por exemplo, rand() do C, Random do Java, Math.random() do JavaScript) usam Geradores de Números Pseudoaleatórios (PRNG).

Estes são determinísticos baseados em um valor semente e podem ter períodos curtos ou padrões discerníveis.

Gerar UUIDs com um PRNG padrão aumenta drasticamente os riscos de colisão e introduz vulnerabilidades de segurança.

Gerador de Números Pseudoaleatórios Criptograficamente Seguro (CSPRNG)

Para gerar UUIDs seguros, deve-se usar um CSPRNG (Cryptographically Secure Pseudo-Random Number Generator).

Os CSPRNGs têm as seguintes propriedades:

  1. Imprevisibilidade: Deve ser computacionalmente inviável prever o próximo número com base nos anteriores.
  2. Irreprodutibilidade: A sequência não pode ser reproduzida a menos que o estado interno esteja comprometido.

Sistemas operacionais e navegadores modernos alcançam isso coletando entropia do ruído do hardware (toques no teclado, movimentos do mouse, E/S de disco, etc.).

  • Navegador Web: crypto.randomUUID() ou crypto.getRandomValues()
  • Node.js: crypto.randomUUID()
  • Python: uuid.uuid4() (usa os.urandom() internamente)

Conclusão

O UUID v4 é uma das soluções mais elegantes e robustas para problemas de identificadores na computação distribuída moderna.

A magnitude avassaladora de 21222^{122} nos fornece garantia matemática.

No entanto, lembre-se de que essa garantia é válida apenas quando "as ferramentas certas (CSPRNG)" são usadas.

Como desenvolvedores, entender os princípios por trás da conveniência e utilizar as APIs de segurança apropriadas é essencial para manter a integridade do sistema.

TechUUIDSecurityCryptography

Explore ferramentas relacionadas

Experimente estas ferramentas gratuitas do Pockit