O que é um UUID?
Um UUID (Universally Unique Identifier) é um valor de 128 bits projetado para ser único entre sistemas sem depender de uma autoridade central. Normalmente, ele é representado por 36 caracteres (32 hexadecimais e 4 hifens), por exemplo:
550e8400-e29b-41d4-a716-446655440000
- 128 bits = 16 bytes
- Formatos de texto: com hifens (
8-4-4-4-12) ou compacto, com 32 caracteres hexadecimais - Maiúsculas e minúsculas:
AaFpodem ser maiúsculas ou minúsculas - UUID nil:
00000000-0000-0000-0000-000000000000(especial “tudo zeros”)
O padrão oficial
O padrão atual da IETF é a RFC 9562 (maio de 2024), que substitui a RFC 4122. Ela esclarece versões anteriores e apresenta formatos modernos ordenáveis por tempo para melhorar o desempenho em bancos de dados e logs.
Versões de UUID e definições
| Versão | Ideia-chave | Uso típico | Notas |
|---|---|---|---|
| UUID v1 | Tempo + identificador de nó | Sistemas legados, correlação de logs | Pode expor informações de horário e host. |
| UUID v2 | DCE security (IDs POSIX) | Especializado/legado | Raro fora de DCE. |
| UUID v3 | Baseado em nome (MD5) | IDs estáveis a partir de um nome | Determinístico; MD5 está desatualizado. Prefira v5. |
| UUID v4 | Aleatório (122 bits) | IDs gerais | Simples, muito suportado. |
| UUID v5 | Baseado em nome (SHA-1) | IDs estáveis a partir de um nome | Determinístico; mesma entrada → mesmo UUID. |
| UUID v6 | Ordenado por tempo (v1 reorganizado) | Inserções ordenadas | Na prática, foi substituído pelo v7. |
| UUID v7 | Tempo + aleatoriedade | Chaves de bancos de dados, logs, eventos | Padrão moderno para UUIDs ordenáveis. |
| UUID v8 | Personalizado | Interoperabilidade e testes | Para formatos e experimentos específicos. |
Escolhas rápidas:
- Precisa de IDs ordenáveis para melhorar a indexação no banco de dados? Use UUIDv7.
- Precisa de IDs determinísticos a partir de uma entrada, como URL ou e-mail? Use UUIDv5.
- Precisa de um ID simples e imprevisível, sem ordenação? Use UUIDv4.
Por que o UUIDv7 é uma boa escolha
- Ordenável por tempo: codifica um timestamp Unix em milissegundos nos bits mais significativos, melhorando a localidade do índice e as consultas por intervalo.
- Continua imprevisível: bits restantes são aleatórios, tornando impraticável adivinhar IDs futuros.
- Vantagens operacionais: inserções mais eficientes em B-tree, menos divisões de página e gravação mais rápida em escala.
Se você usa v1 para ordenação, mudar para v7 oferece benefícios semelhantes sem expor identificadores de hardware.
Risco de colisão
Para v4 (122 bits aleatórios), colisões são astronomicamente improváveis. Em termos práticos, seria necessário gerar cerca de 1 bilhão de UUIDs por segundo durante aproximadamente 85 anos para alcançar cerca de 50% de chance de colisão. Use um gerador aleatório de alta qualidade.
Conclusão: em sistemas reais, trate UUIDs v4/v7 como únicos quando bem gerados.
UUIDs baseados em nome (v3/v5)
- Combine um namespace (ex.: DNS, URL) com um nome (string) e faça hash.
- Determinístico: as mesmas entradas sempre produzem o mesmo UUID.
- Ótimo para chaves de idempotência, deduplicação, referências estáveis entre serviços.
- Prefira v5 (SHA-1) em vez de v3 (MD5). Esses UUIDs são identificadores, não senhas.
Boas práticas
- Escolha a versão certa
- v7 para ordem temporal e desempenho em bancos de dados.
- v4 quando você precisa apenas de IDs aleatórios fortes.
- v5 para IDs determinísticos de nomes (escolha um namespace fixo).
- Armazenamento
- Use colunas binárias de 16 bytes (ex.:
BINARY(16)) em vez deCHAR(36). - Em PostgreSQL, use o tipo
uuid; para semântica ordenada, armazene v7.
- Use colunas binárias de 16 bytes (ex.:
- Indexação
- Prefira v7 para evitar pontos de concentração aleatórios e melhorar a localidade do índice.
- Formatação
- Aceite formatos com hifens e compactos; normalize para um único formato nos logs.
- Aceite caracteres hexadecimais em letras maiúsculas ou minúsculas.
- Segurança
- UUIDs são identificadores, não segredos. Evite expor informações por meio do v1. Não use UUIDs como tokens de autenticação.
- Validação
- Exija:
- 32 caracteres hexadecimais (compacto) ou
8-4-4-4-12com hifens - Versão correta (
1–8) - Variante correta (
10xxpara RFC)
- 32 caracteres hexadecimais (compacto) ou
- Exija:
FAQ
Um UUID é um identificador de 128 bits normalmente apresentado com 36 caracteres: 8-4-4-4-12 em hexadecimal com hifens (ex.: 550e8400-e29b-41d4-a716-446655440000). Letras maiúsculas e minúsculas são equivalentes. O formato compacto usa 32 caracteres hexadecimais sem hifens.
Por padrão, use UUIDv7 para IDs ordenáveis por tempo e eficientes em índices de bancos de dados. Use UUIDv4 para IDs aleatórios quando a ordenação não importa. Use UUIDv5 quando precisar de IDs determinísticos derivados de um nome.
v4 é puramente aleatório (122 bits aleatórios), simples mas não naturalmente ordenável. v7 codifica um timestamp nos bits mais significativos e usa aleatoriedade no restante, permitindo ordenação quase cronológica com boa imprevisibilidade. É ideal para bancos de dados e logs com muitas gravações.
Na prática, sim, na maioria dos contextos de desenvolvimento. “GUID” é o termo da Microsoft; “UUID” é o nome do padrão IETF. Ambos se referem a identificadores únicos de 128 bits.
Sim, com v7, que foi criado para ordenação temporal. v1/v6 também permitem ordenar por tempo, mas apresentam questões de privacidade e compatibilidade. v4 é aleatório e não ordenável por tempo.
Com um RNG adequado, as colisões v4/v7 são astronomicamente improváveis para volumes reais. Trate-os como únicos e garanta um gerador de alta qualidade.
Use v5 para obter um ID estável a partir de um namespace (ex.: DNS, URL) e um nome (string). As mesmas entradas geram o mesmo UUID. Isso é útil para chaves de idempotência, deduplicação e referências entre serviços.
UUIDs são identificadores, não segredos. Não confie neles para autenticação/autorização. Evite dados sensíveis no v1, pois ele pode expor informações de horário e do host. Prefira v4/v7 e use segredos próprios para autenticação.
Prefira tipos binários de 16 bytes quando disponíveis (ex.: PostgreSQL uuid, MySQL BINARY(16)), não CHAR(36). Isso economiza espaço e acelera comparações e índices.
Os bits mais altos ordenados por tempo melhoram a localidade de B-tree, reduzem divisões de páginas e aceleram ingestão. Mantenha aleatoriedade suficiente para evitar previsibilidade e permitir consultas eficientes por intervalo.
O nil UUID é todo zeros: 00000000-0000-0000-0000-000000000000. Representa um valor “vazio” ou não inicializado; não use para entidades reais.
Verifique 32 caracteres hexadecimais (compacto) ou 8-4-4-4-12 com hifens, aceitando letras maiúsculas ou minúsculas, versão correta (1–8) e variante (8|9|a|b). Rejeite o resto.
Não. Caracteres hexadecimais não diferenciam maiúsculas de minúsculas. Normalize para um estilo, geralmente minúsculas, para manter a consistência em logs e interfaces.
Evite. UUIDs são opacos por definição. Se você precisa de IDs legíveis ou estritamente monotônicos, use esquemas sequenciais ou formatos como ULID/KSUID e considere as vantagens e desvantagens.
Sim, na maioria dos novos desenvolvimentos. v7 preserva benefícios de ordenação sem expor MAC/tempo. Em migrações, faça gravação dupla ou preenchimento retroativo, mantendo as chaves primárias estáveis para evitar alterações em massa.
Nenhuma diferença semântica. Hifens ajudam na leitura; o formato compacto economiza bytes em texto. Armazene em binário internamente e escolha um formato de apresentação único externamente.
Sim. Com v7 (ou v4 com uma estratégia de ordenação), os bancos de dados funcionam bem. Garanta uma indexação adequada, use armazenamento binário e faça testes de desempenho com sua carga real.
Escolha um namespace UUID fixo (DNS/URL/próprio) e uma string estável. O hashing (SHA-1) produz sempre o mesmo UUID. Não use v5 como segredo; trate-o apenas como identificador estável.
Referência rápida
Reconhecer um UUID com hifens, em letras maiúsculas ou minúsculas:
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
Compacto (sem hifens):
^[0-9a-fA-F]{32}$
Detecte a versão no 13º dígito hexadecimal (1 a 8) e a variante no 17º dígito (8|9|a|b).
Quando preferir IDs sequenciais
- Precisa de inteiros estritamente monotônicos, como números de fatura.
- Tabelas pequenas e chaves legíveis por humanos.
- Precisa de significado de negócio embutido (UUIDs são intencionalmente opacos).
Nos demais casos, UUIDv7 é uma escolha sólida.