UUID v3 Generator
Generate deterministic name-based UUID v3 using MD5
Namespace
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Naam
Gegenereerde UUID v3
Wat is UUID v3?
UUID v3 is een op naam gebaseerde UUID-versie gedefinieerd in RFC 4122. In plaats van willekeurige gegevens of een tijdstempel leidt het de UUID deterministisch af van twee invoeren: een namespace-UUID en een naam-string. Het namespace + naam-paar wordt gehasht met MD5, en de resulterende hash wordt opgemaakt als een UUID.
De sleuteleigenschap van UUID v3 is determinisme: dezelfde namespace en naam zullen altijd de identieke UUID produceren, op elke machine, op elk moment. Dit maakt het geschikt voor content-adressering — stabiele identificatoren genereren voor resources die worden geïdentificeerd door een betekenisvolle naam.
UUID v3 gebruikt MD5 als hash-functie. MD5 wordt beschouwd als cryptografisch gebroken voor beveiligingsdoeleinden, wat de reden is dat UUID v5 (dat SHA-1 gebruikt) over het algemeen de voorkeur heeft voor nieuwe ontwikkeling. Noch v3 noch v5 biedt willekeurigheid — ze zijn puur deterministisch.
Standaard namespaces
RFC 4122 definieert vier vooraf toegewezen namespace-UUIDs. Het gebruik van een standaard namespace zorgt voor interoperabiliteit — twee onafhankelijke implementaties zullen dezelfde UUID v3 produceren voor dezelfde naam binnen dezelfde namespace:
| Namespace | UUID | Gebruik voor |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Volledig gekwalificeerde domeinnamen (bijv. 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL's en URI's (bijv. 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO-objectidentificatoren (bijv. '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 Distinguished Names (bijv. 'cn=John,dc=example,dc=com') |
U kunt ook elke willekeurige UUID gebruiken als aangepaste namespace — bijvoorbeeld een UUID v4 die u eenmalig genereert en inbedt in uw toepassing als een constante. Dit stelt u in staat een privé-namespace te maken voor uw eigen naam-naar-UUID-toewijzingen.
UUID v3 vs UUID v5
UUID v3 en UUID v5 zijn structureel identiek — beide zijn deterministische, op naam gebaseerde UUIDs. Het enige verschil is de hash-functie:
- Gebruikt MD5-hashing
- 128-bit uitvoer (UUID-formaat)
- Gedefinieerd in RFC 4122
- MD5 is cryptografisch gebroken
- Ondersteund door alle UUID-bibliotheken
- Gebruikt SHA-1-hashing
- 160-bit hash afgekapt tot 128 bits
- Gedefinieerd in RFC 4122
- SHA-1 is verouderd voor beveiligingsgebruik maar sterker dan MD5
- Ondersteund door alle UUID-bibliotheken
Geef de voorkeur aan UUID v5 boven UUID v3 voor alle nieuwe ontwikkeling. De SHA-1-hash is sterker dan MD5, en het prestatieverschil is verwaarloosbaar. Gebruik UUID v3 alleen wanneer u UUIDs moet reproduceren van een systeem dat het al gebruikt.
Wanneer UUID v3 gebruiken
UUID v3 (en v5) zijn geschikt wanneer u een stabiele, reproduceerbare identificator nodig heeft afgeleid van een betekenisvolle naam — in plaats van een willekeurige ID die opgeslagen en opgezocht moet worden:
Determinisme begrijpen
Het determinisme van UUID v3 is zowel zijn grootste kracht als zijn belangrijkste beperking. Gegeven elke namespace-UUID en elke naam-string, is de uitvoer-UUID volledig vastgesteld — er is geen willekeurigheid bij betrokken. Dit betekent:
Levert altijd op: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Als een aanvaller de namespace kent en de naam kan raden, kan hij de UUID van tevoren berekenen. UUID v3-waarden mogen nooit worden gebruikt als onvoorspelbare tokens, sessie-ID's of geheimen. Gebruik UUID v4 voor elke beveiligingsgevoelige identificator.
Codevoorbeelden
UUID v3 vereist een namespace-UUID en een naam-string. Gebruik het standaard uuid-pakket:
// 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)
}