UUID v3 Generator
Generate deterministic name-based UUID v3 using MD5
Namespace
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name
Generierte UUID v3
Was ist UUID v3?
UUID v3 ist eine namensbasierte UUID-Version, definiert in RFC 4122. Statt Zufallsdaten oder einem Zeitstempel leitet sie die UUID deterministisch aus zwei Eingaben ab: einer Namespace-UUID und einem Namen-String. Das Namespace + Name-Paar wird mit MD5 gehasht, und der resultierende Hash wird als UUID formatiert.
Die Schlüsseleigenschaft von UUID v3 ist Determinismus: Derselbe Namespace und Name werden immer dieselbe UUID erzeugen, auf jeder Maschine, zu jeder Zeit. Das macht es für Content-Addressing geeignet — stabile Bezeichner für Ressourcen zu generieren, die durch einen bedeutungsvollen Namen identifiziert werden.
UUID v3 verwendet MD5 als Hash-Funktion. MD5 gilt für Sicherheitszwecke als kryptografisch gebrochen, weshalb UUID v5 (das SHA-1 verwendet) für neue Entwicklung generell bevorzugt wird. Weder v3 noch v5 bietet Zufälligkeit — sie sind rein deterministisch.
Standard-Namespaces
RFC 4122 definiert vier vorab zugewiesene Namespace-UUIDs. Die Verwendung eines Standard-Namespace stellt die Interoperabilität sicher — zwei unabhängige Implementierungen werden dieselbe UUID v3 für denselben Namen innerhalb desselben Namespace produzieren:
| Namespace | UUID | Verwendung für |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Vollqualifizierte Domain-Namen (z. B. 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URLs und URIs (z. B. 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO-Objektbezeichner (z. B. '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 Distinguished Names (z. B. 'cn=John,dc=example,dc=com') |
Sie können auch jede beliebige UUID als benutzerdefinierten Namespace verwenden — zum Beispiel eine UUID v4, die Sie einmal generieren und als Konstante in Ihre Anwendung einbetten. Das ermöglicht Ihnen, einen privaten Namespace für Ihre eigenen Name-zu-UUID-Zuordnungen zu erstellen.
UUID v3 vs UUID v5
UUID v3 und UUID v5 sind strukturell identisch — beide sind deterministische, namensbasierte UUIDs. Der einzige Unterschied ist die Hash-Funktion:
- Verwendet MD5-Hashing
- 128-Bit-Ausgabe (UUID-Größe)
- Definiert in RFC 4122
- MD5 ist kryptografisch gebrochen
- Von allen UUID-Bibliotheken unterstützt
- Verwendet SHA-1-Hashing
- 160-Bit-Hash auf 128 Bits abgeschnitten
- Definiert in RFC 4122
- SHA-1 ist für Sicherheitsnutzung veraltet, aber stärker als MD5
- Von allen UUID-Bibliotheken unterstützt
Bevorzugen Sie UUID v5 gegenüber UUID v3 für alle neue Entwicklung. Der SHA-1-Hash ist stärker als MD5, und der Performance-Unterschied ist vernachlässigbar. Verwenden Sie UUID v3 nur, wenn Sie UUIDs aus einem System reproduzieren müssen, das es bereits verwendet.
Wann UUID v3 verwenden
UUID v3 (und v5) sind angemessen, wenn Sie einen stabilen, reproduzierbaren Bezeichner benötigen, der von einem bedeutungsvollen Namen abgeleitet wird — statt einer zufälligen ID, die gespeichert und nachgeschlagen werden muss:
Determinismus verstehen
Der Determinismus von UUID v3 ist sowohl seine größte Stärke als auch seine wichtigste Einschränkung. Für jede Namespace-UUID und jeden Namen-String ist die Ausgabe-UUID vollständig festgelegt — keine Zufälligkeit ist beteiligt. Das bedeutet:
Ergibt immer: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Wenn ein Angreifer den Namespace kennt und den Namen erraten kann, kann er die UUID im Voraus berechnen. UUID v3-Werte sollten niemals als unvorhersagbare Token, Sitzungs-IDs oder Geheimnisse verwendet werden. Verwenden Sie UUID v4 für jeden sicherheitssensiblen Bezeichner.
Code-Beispiele
UUID v3 erfordert eine Namespace-UUID und einen Namen-String. Verwenden Sie das Standard-Paket 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)
}