Gerador UUID v3

Gera UUID v3 determinísticos baseados em nome usando MD5

Namespace

6ba7b810-9dad-11d1-80b4-00c04fd430c8

Nome

UUID v3 gerado

Insira um nome e clique em Gerar
O mesmo namespace + nome sempre produz o mesmo UUID
Note:UUID v3 é um formato legado usando hash MD5. Para novo desenvolvimento que requeira UUIDs determinísticos, prefira UUID v5 (SHA-1). Para IDs únicos de propósito geral, use UUID v4.

O que é UUID v3?

UUID v3 é uma versão UUID baseada em nome definida no RFC 4122. Em vez de dados aleatórios ou um timestamp, ela deriva o UUID deterministicamente a partir de duas entradas: um UUID de namespace e uma string de nome. O par namespace + nome é hasheado usando MD5, e o hash resultante é formatado como UUID.

A propriedade chave do UUID v3 é o determinismo: o mesmo namespace e nome sempre produzirão o UUID idêntico, em qualquer máquina, a qualquer momento. Isso o torna adequado para endereçamento de conteúdo — gerando identificadores estáveis para recursos que são identificados por um nome significativo.

UUID v3 usa MD5 como função hash. MD5 é considerado criptograficamente quebrado para fins de segurança, razão pela qual UUID v5 (que usa SHA-1) é geralmente preferido para novo desenvolvimento. Nem v3 nem v5 fornecem aleatoriedade — eles são puramente determinísticos.

Namespaces Padrão

RFC 4122 define quatro UUIDs de namespace pré-atribuídos. Usar um namespace padrão garante interoperabilidade — duas implementações independentes produzirão o mesmo UUID v3 para o mesmo nome dentro do mesmo namespace:

NamespaceUUIDUsar para
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Nomes de domínio totalmente qualificados (ex.: 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URLs e URIs (ex.: 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Identificadores de Objeto ISO (ex.: '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Nomes Distintos X.500 (ex.: 'cn=John,dc=example,dc=com')

Você também pode usar qualquer UUID arbitrário como namespace personalizado — por exemplo, um UUID v4 que você gera uma vez e incorpora em sua aplicação como constante. Isso permite criar um namespace privado para seus próprios mapeamentos de nome para UUID.

UUID v3 vs UUID v5

UUID v3 e UUID v5 são estruturalmente idênticos — ambos são UUIDs determinísticos baseados em nome. A única diferença é a função hash:

UUID v3
  • Usa hash MD5
  • Saída de 128 bits (tamanho UUID)
  • Definido no RFC 4122
  • MD5 está criptograficamente quebrado
  • Suportado por todas as bibliotecas UUID
UUID v5
  • Usa hash SHA-1
  • Hash de 160 bits truncado para 128 bits
  • Definido no RFC 4122
  • SHA-1 está depreciado para uso de segurança, mas é mais forte que MD5
  • Suportado por todas as bibliotecas UUID

Prefira UUID v5 a UUID v3 para todo novo desenvolvimento. O hash SHA-1 é mais forte que MD5, e a diferença de desempenho é insignificante. Use UUID v3 apenas quando precisar reproduzir UUIDs de um sistema que já o usa.

Quando Usar UUID v3

UUID v3 (e v5) são apropriados quando você precisa de um identificador estável e reproduzível derivado de um nome significativo — em vez de um ID aleatório que deve ser armazenado e consultado:

Canonicalização de URL
Gere um UUID determinístico para qualquer URL para usar como chave compacta de comprimento fixo em um banco de dados ou cache — sem armazenar uma tabela de mapeamento.
Identificadores baseados em DNS
Atribua UUIDs estáveis a hostnames ou nomes de domínio que permaneçam consistentes entre implantações e bancos de dados.
Endereçamento de conteúdo
Crie IDs reproduzíveis para itens de conteúdo identificados por seu nome canônico — artigos, produtos ou chaves de configuração.
Criação de recursos idempotente
Gere o mesmo UUID para o mesmo nome de recurso, de modo que tentativas de criação repetidas sejam naturalmente idempotentes sem uma consulta.
Fixtures de teste
Produza UUIDs estáveis e previsíveis em dados de teste para que as asserções de teste não precisem ser atualizadas quando os testes forem reexecutados.
Deduplicação entre sistemas
Dois sistemas independentes podem derivar o mesmo UUID para o mesmo nome sem comunicação, possibilitando deduplicação sem um registro de IDs compartilhado.

Entendendo o Determinismo

O determinismo do UUID v3 é tanto seu maior ponto forte quanto sua restrição mais importante. Dado qualquer UUID de namespace e qualquer string de nome, o UUID de saída é completamente fixo — nenhuma aleatoriedade está envolvida. Isso significa:

Exemplo (namespace DNS, nome = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

Sempre produz: 9073926b-929f-31c2-abc9-fad77ae3e8eb

Se um atacante conhece o namespace e pode adivinhar o nome, ele pode calcular o UUID antecipadamente. Valores UUID v3 nunca devem ser usados como tokens imprevisíveis, IDs de sessão ou segredos. Use UUID v4 para qualquer identificador sensível à segurança.

Exemplos de Código

UUID v3 requer um UUID de namespace e uma string de nome. Use o pacote padrão uuid:

JavaScript / Node.js
// Browser / Node.js — UUID v3 without dependencies
function uuidV3(namespace, name) {
  // namespace must be a UUID string like '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
  const nsBytes = namespace.replace(/-/g, '').match(/../g).map(h => parseInt(h, 16))
  const nameBytes = [...new TextEncoder().encode(name)]
  const combined = new Uint8Array([...nsBytes, ...nameBytes])

  // md5(combined) — use your preferred MD5 library or the inline implementation
  const hash = md5(combined) // returns Uint8Array(16)
  hash[6] = (hash[6] & 0x0f) | 0x30 // version 3
  hash[8] = (hash[8] & 0x3f) | 0x80 // variant

  const h = [...hash].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20)}`
}

// Using the 'uuid' npm package
import { v3 as uuidv3 } from 'uuid'
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
console.log(uuidv3('example.com', uuidv3.DNS))
// → '9073926b-929f-31c2-abc9-fad77ae3e8eb' (always the same)
Python
import uuid

# Using the standard library
dns_uuid = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(dns_uuid)
# → 9073926b-929f-31c2-abc9-fad77ae3e8eb

url_uuid = uuid.uuid3(uuid.NAMESPACE_URL, 'https://example.com/page')
print(url_uuid)

# Custom namespace
MY_NS = uuid.UUID('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
custom = uuid.uuid3(MY_NS, 'my-entity-name')
print(custom)
Go
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // Standard DNS namespace
    ns := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
    id := uuid.NewMD5(ns, []byte("example.com"))
    fmt.Println(id)
    // → 9073926b-929f-31c2-abc9-fad77ae3e8eb

    // URL namespace
    urlNS := uuid.MustParse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")
    idURL := uuid.NewMD5(urlNS, []byte("https://example.com/page"))
    fmt.Println(idURL)
}

Perguntas Frequentes

UUID v3 e UUID v5 são intercambiáveis?
Não — eles produzem saídas diferentes para as mesmas entradas porque usam funções hash diferentes (MD5 vs SHA-1). Um UUID v3 e um UUID v5 gerados do mesmo namespace + nome serão UUIDs diferentes. Eles não são intercambiáveis, mas são funcionalmente equivalentes em estrutura e casos de uso.
UUID v3 é resistente a colisões?
Dentro de um namespace dado, dois nomes diferentes produzirão valores UUID v3 diferentes enquanto MD5 não produzir uma colisão para essas entradas específicas. Ataques de colisão MD5 existem, mas requerem entradas cuidadosamente elaboradas — na prática, nomes que ocorrem naturalmente (URLs, nomes de domínio, IDs de produto) não colidirão. Para maior garantia, use UUID v5.
Posso usar UUID v3 como chave primária em um banco de dados?
Sim, se você entender as compensações. UUID v3 é determinístico, portanto a mesma chave será gerada para o mesmo nome — isso fornece idempotência natural. No entanto, UUID v3 não é ordenável por ordem de geração, e a fragmentação de índice se aplica assim como com UUID v4. Para chaves primárias ordenáveis ordenadas por tempo, use UUID v7.
Qual codificação devo usar para a entrada do nome?
RFC 4122 especifica que o nome deve ser convertido em bytes usando a forma canônica do namespace. Para o namespace DNS, use o nome de domínio como string UTF-8 sem ponto final. Para o namespace URL, use a URL completa como string UTF-8. Sempre use a mesma codificação de forma consistente — diferentes codificações do mesmo nome lógico produzirão UUIDs diferentes.
UUID v3 oculta o nome original?
MD5 é uma função unidirecional — você não pode reverter um UUID v3 para recuperar o nome original. No entanto, se um atacante conhece o namespace e suspeita de um pequeno conjunto de possíveis nomes, ele pode pré-calcular valores UUID v3 para cada candidato e comparar. Para nomes de um espaço pequeno ou previsível, UUID v3 não fornece confidencialidade. Use UUID v4 se precisar de um identificador opaco e impossível de adivinhar.