UUID v4: o que é e quando usar?
Entenda as versões de UUID, por que a v4 é a mais usada, a probabilidade real de colisão, e quando preferir UUID a auto-incremento em bancos de dados.
UUID (Universally Unique Identifier) é um identificador de 128 bits padronizado pela RFC 4122. É representado como 32 caracteres hexadecimais em grupos separados por hífens: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. O objetivo é gerar identificadores únicos sem necessidade de coordenação central entre sistemas.
As versões do UUID
- v1: baseado em timestamp + endereço MAC. Ordenável mas expõe informações da máquina.
- v3: hash MD5 de um namespace + nome. Determinístico.
- v4: aleatório (122 bits de entropia). O mais usado.
- v5: hash SHA-1 de um namespace + nome. Determinístico, mais seguro que v3.
- v7: timestamp Unix em alta resolução + aleatoriedade. Ordenável e recomendado para bancos de dados.
Qual é a probabilidade real de colisão no v4?
Com 122 bits de aleatoriedade, o UUID v4 tem 2¹²² ≈ 5,3 × 10³⁶ valores possíveis. Para ter 50% de chance de uma colisão, você precisaria gerar 2,71 quintilhões de UUIDs. Se você gerasse 1 bilhão de UUIDs por segundo, levaria 86 anos para atingir essa probabilidade. Na prática, colisões são impossíveis para qualquer sistema real.
UUID vs auto-incremento: quando usar cada um?
- UUID: sistemas distribuídos (sem coordenação central), IDs gerados no cliente, privacidade (não revela quantidade de registros), merge de dados entre bancos
- Auto-incremento: sistemas centralizados simples, melhor performance em JOINs e índices, menor uso de espaço no banco, facilidade de debug (IDs legíveis)
Armazenando UUID eficientemente
Armazene UUIDs como BINARY(16) ou UUID nativo (MySQL 8+, PostgreSQL com extensão uuid-ossp) em vez de VARCHAR(36). Isso reduz o tamanho em disco em mais de 50% e melhora a performance de índices. No MySQL 8+, use UUID_TO_BIN(uuid, 1) para armazenar em formato que é eficiente para índices.
Use o Gerador de UUID do UtilDev para gerar UUIDs v4 no formato padrão (com hífens) ou sem hífens, individualmente ou em lote.