Generador UUID v3
Genera UUID v3 deterministas basados en nombre usando MD5
Espacio de nombres
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Nombre
UUID v3 generado
¿Qué es UUID v3?
UUID v3 es una versión UUID basada en nombre definida en RFC 4122. En lugar de datos aleatorios o una marca de tiempo, deriva el UUID de forma determinista a partir de dos entradas: un UUID de espacio de nombres y una cadena de nombre. El par espacio de nombres + nombre se hashea con MD5, y el hash resultante se formatea como UUID.
La propiedad clave de UUID v3 es el determinismo: el mismo espacio de nombres y nombre siempre producirán el UUID idéntico, en cualquier máquina, en cualquier momento. Esto lo hace adecuado para el direccionamiento de contenido — generando identificadores estables para recursos que se identifican por un nombre significativo.
UUID v3 usa MD5 como función hash. MD5 se considera criptográficamente roto para propósitos de seguridad, por lo que UUID v5 (que usa SHA-1) generalmente se prefiere para desarrollo nuevo. Ni v3 ni v5 proporcionan aleatoriedad — son puramente deterministas.
Espacios de Nombres Estándar
RFC 4122 define cuatro UUIDs de espacio de nombres preasignados. Usar un espacio de nombres estándar garantiza la interoperabilidad — dos implementaciones independientes producirán el mismo UUID v3 para el mismo nombre dentro del mismo espacio de nombres:
| Espacio de Nombres | UUID | Usar para |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Nombres de dominio completamente calificados (p. ej. 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URLs y URIs (p. ej. 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | Identificadores de Objeto ISO (p. ej. '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | Nombres Distinguidos X.500 (p. ej. 'cn=John,dc=example,dc=com') |
También puede usar cualquier UUID arbitrario como espacio de nombres personalizado — por ejemplo, un UUID v4 que genere una vez e incorpore en su aplicación como constante. Esto le permite crear un espacio de nombres privado para sus propias asignaciones de nombre a UUID.
UUID v3 vs UUID v5
UUID v3 y UUID v5 son estructuralmente idénticos — ambos son UUIDs deterministas basados en nombre. La única diferencia es la función hash:
- Usa hash MD5
- Salida de 128 bits (tamaño UUID)
- Definido en RFC 4122
- MD5 está criptográficamente roto
- Soportado por todas las bibliotecas UUID
- Usa hash SHA-1
- Hash de 160 bits truncado a 128 bits
- Definido en RFC 4122
- SHA-1 está deprecado para uso de seguridad pero es más fuerte que MD5
- Soportado por todas las bibliotecas UUID
Prefiera UUID v5 sobre UUID v3 para todo desarrollo nuevo. El hash SHA-1 es más fuerte que MD5, y la diferencia de rendimiento es insignificante. Use UUID v3 solo cuando necesite reproducir UUIDs de un sistema que ya lo usa.
Cuándo Usar UUID v3
UUID v3 (y v5) son apropiados cuando necesita un identificador estable y reproducible derivado de un nombre significativo — en lugar de un ID aleatorio que debe almacenarse y buscarse:
Entendiendo el Determinismo
El determinismo de UUID v3 es tanto su mayor fortaleza como su restricción más importante. Dado cualquier UUID de espacio de nombres y cualquier cadena de nombre, el UUID de salida está completamente fijo — no se involucra aleatoriedad. Esto significa:
Siempre produce: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Si un atacante conoce el espacio de nombres y puede adivinar el nombre, puede calcular el UUID de antemano. Los valores UUID v3 nunca deben usarse como tokens impredecibles, IDs de sesión o secretos. Use UUID v4 para cualquier identificador sensible a la seguridad.
Ejemplos de Código
UUID v3 requiere un UUID de espacio de nombres y una cadena de nombre. Use el paquete estándar uuid:
// 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)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)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)
}