UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Namespace

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

Name

Generierte UUID v3

Namen eingeben und auf Generieren klicken
Gleicher Namespace + Name ergibt immer dieselbe UUID
Note:UUID v3 ist ein Legacy-Format, das MD5-Hashing verwendet. Für neue Entwicklung, die deterministische UUIDs erfordert, bevorzugen Sie UUID v5 (SHA-1). Für allgemeine eindeutige IDs verwenden Sie UUID v4.

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:

NamespaceUUIDVerwendung für
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Vollqualifizierte Domain-Namen (z. B. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URLs und URIs (z. B. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO-Objektbezeichner (z. B. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.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:

UUID v3
  • Verwendet MD5-Hashing
  • 128-Bit-Ausgabe (UUID-Größe)
  • Definiert in RFC 4122
  • MD5 ist kryptografisch gebrochen
  • Von allen UUID-Bibliotheken unterstützt
UUID v5
  • 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:

URL-Kanonisierung
Generieren Sie eine deterministische UUID für jede URL, um sie als kompakten, festen Schlüssel in einer Datenbank oder einem Cache zu verwenden — ohne eine Zuordnungstabelle zu speichern.
DNS-basierte Bezeichner
Weisen Sie stabile UUIDs zu Hostnamen oder Domain-Namen zu, die über Deployments und Datenbanken hinweg konsistent bleiben.
Content-Addressing
Erstellen Sie reproduzierbare IDs für Inhaltselemente, die durch ihren kanonischen Namen identifiziert werden — Artikel, Produkte oder Konfigurationsschlüssel.
Idempotente Ressourcenerstellung
Generieren Sie dieselbe UUID für denselben Ressourcennamen, sodass wiederholte Erstellungsversuche von Natur aus idempotent sind, ohne Nachschlagen.
Test-Fixtures
Erzeugen Sie stabile, vorhersagbare UUIDs in Testdaten, sodass Test-Assertions nicht aktualisiert werden müssen, wenn Tests erneut ausgeführt werden.
Systemübergreifende Deduplizierung
Zwei unabhängige Systeme können dieselbe UUID für denselben Namen ohne Kommunikation ableiten und so die Deduplizierung ohne ein gemeinsames ID-Register ermöglichen.

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:

Beispiel (DNS-Namespace, Name = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

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:

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)
}

Häufig gestellte Fragen

Sind UUID v3 und UUID v5 austauschbar?
Nein — sie erzeugen für dieselben Eingaben unterschiedliche Ausgaben, weil sie unterschiedliche Hash-Funktionen verwenden (MD5 vs. SHA-1). Eine UUID v3 und eine UUID v5, die aus demselben Namespace + Namen generiert werden, sind unterschiedliche UUIDs. Sie sind nicht austauschbar, aber sie sind in Struktur und Anwendungsfällen funktional äquivalent.
Ist UUID v3 kollisionsresistent?
Innerhalb eines gegebenen Namespace werden zwei verschiedene Namen unterschiedliche UUID v3-Werte erzeugen, solange MD5 keine Kollision für diese spezifischen Eingaben produziert. MD5-Kollisionsangriffe existieren, erfordern aber sorgfältig konstruierte Eingaben — in der Praxis werden natürlich vorkommende Namen (URLs, Domain-Namen, Produkt-IDs) nicht kollidieren. Für höhere Sicherheit verwenden Sie UUID v5.
Kann ich UUID v3 als Primärschlüssel in einer Datenbank verwenden?
Ja, wenn Sie die Kompromisse verstehen. UUID v3 ist deterministisch, sodass derselbe Schlüssel für denselben Namen generiert wird — das bietet natürliche Idempotenz. UUID v3 ist jedoch nicht nach Generierungsreihenfolge sortierbar, und Index-Fragmentierung gilt genau wie bei UUID v4. Für zeitgeordnete, sortierbare Primärschlüssel verwenden Sie UUID v7.
Welche Kodierung soll ich für die Namenseingabe verwenden?
RFC 4122 gibt an, dass der Name mit der kanonischen Form des Namespace in Bytes konvertiert werden soll. Für den DNS-Namespace verwenden Sie den Domain-Namen als UTF-8-String ohne abschließenden Punkt. Für den URL-Namespace verwenden Sie die vollständige URL als UTF-8-String. Verwenden Sie immer konsistent dieselbe Kodierung — verschiedene Kodierungen desselben logischen Namens werden verschiedene UUIDs erzeugen.
Verbirgt UUID v3 den ursprünglichen Namen?
MD5 ist eine Einwegfunktion — Sie können eine UUID v3 nicht rückgängig machen, um den ursprünglichen Namen wiederherzustellen. Wenn ein Angreifer jedoch den Namespace kennt und einen kleinen Satz möglicher Namen vermutet, kann er UUID v3-Werte für jeden Kandidaten vorab berechnen und vergleichen. Für Namen aus einem kleinen oder vorhersagbaren Raum bietet UUID v3 keine Vertraulichkeit. Verwenden Sie UUID v4, wenn Sie einen undurchsichtigen, nicht erratbaren Bezeichner benötigen.