UUID v2 Generator
Generate DCE Security UUID v2 with local domain and ID
Was ist UUID v2?
UUID v2 ist die DCE Security-UUID-Version, standardisiert als Teil der Distributed Computing Environment (DCE)-Spezifikation und in RFC 4122 referenziert. Sie erweitert UUID v1 durch das Einbetten eines POSIX-Benutzer- oder Gruppenbezeichners (UID/GID) in das Zeitstempelfeld.
Die Struktur ist ähnlich wie UUID v1, aber das 32-Bit-Feld time_low wird durch einen 32-Bit-lokalen Bezeichner (z. B. eine POSIX-UID) ersetzt, und ein 1-Byte-local_domain-Feld identifiziert, welche Art lokaler ID es ist. Der Zeitstempel wird dadurch abgeschnitten, was seine Präzision und Eindeutigkeitsgarantien reduziert.
UUID v2 ist in moderner Software äußerst selten. Die meisten Entwickler werden es nie generieren müssen. Diese Seite dokumentiert das Format für die Vollständigkeit und zur Unterstützung bei der Dekodierung von UUID v2-Werten aus Legacy-Systemen.
UUID v2-Struktur
Eine UUID v2 hat dasselbe 128-Bit-, Bindestriche-Format wie andere UUID-Versionen. Die Felder unterscheiden sich von UUID v1 wie folgt:
| Feld | Bits | Zweck |
|---|---|---|
| local_id | 32 | <code>local_id</code> — 32-Bit lokaler Domain-Bezeichner (z. B. POSIX UID aus <code>/etc/passwd</code>), ersetzt das time_low-Feld von UUID v1 |
| time_mid | 16 | <code>time_mid</code> — mittlere 16 Bits des abgeschnittenen UUID v1-Zeitstempels |
| time_hi+version | 16 | <code>time_hi_and_version</code> — obere 12 Zeitstempel-Bits mit Versions-Nibble auf <code>2</code> gesetzt |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — Varianten-Bits plus oberer Teil der Taktsequenz |
| local_domain | 8 | <code>local_domain</code> — Domain-Bezeichner: <code>0</code> = POSIX-Benutzer (UID), <code>1</code> = POSIX-Gruppe (GID), <code>2</code> = Organisation |
| node | 48 | <code>node</code> — 48-Bit MAC-Adresse des generierenden Hosts |
Beispiel: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = POSIX-Benutzer
Lokale Domain-Werte
Das local_domain-Byte gibt den Typ des in der UUID eingebetteten lokalen Bezeichners an:
Die Domain-Werte sind durch die DCE-Spezifikation definiert. Werte 3–255 sind reserviert. In der Praxis wird nur Domain 0 (Person/UID) häufig in echten UUID v2-Werten angetroffen.
Warum UUID v2 selten verwendet wird
Drei Eigenschaften machen UUID v2 für die meisten modernen Anwendungen unpraktisch:
Grobe Zeitstempel-Auflösung
Der Zeitstempel wird auf 28 Bits abgeschnitten (ungefähr 7,2-Minuten-Granularität). Innerhalb dieses Fensters sind UUIDs, die mit derselben local_id und Domain auf demselben Host generiert werden, nicht eindeutig — die Spezifikation verlässt sich auf das clock_seq-Feld, um sie zu unterscheiden, was die Eindeutigkeit auf 64 Werte pro 7-Minuten-Fenster begrenzt.
Keine Standard-Bibliotheks-Unterstützung
Im Gegensatz zu UUID v1 und v4 wird UUID v2 von den meisten UUID-Bibliotheken nicht unterstützt. Das npm-Paket uuid, das Python-Modul uuid und Javas java.util.UUID lassen v2 alle aus. Benutzerdefinierte Implementierung ist erforderlich.
POSIX-spezifische Semantik
Das lokale Domain-Konzept (UID/GID) ist inhärent POSIX-spezifisch und lässt sich nicht sinnvoll auf Windows, eingebettete Systeme oder Cloud-Umgebungen übertragen, in denen das Konzept einer POSIX-Benutzer-ID fehlt.
Historischer Kontext
UUID v2 wurde als Teil der Distributed Computing Environment (DCE/RPC) der Open Software Foundation in den frühen 1990er Jahren definiert. Das Ziel war es, UUIDs zu erstellen, die Autorisierungskontext tragen können — insbesondere um einem RPC-Server zu ermöglichen, den aufrufenden Benutzer ohne einen separaten Authentifizierungsschritt zu identifizieren.
Das DCE-Sicherheitsmodell nahm eine homogene POSIX-Umgebung an, in der jeder Knoten an einem gemeinsamen UID/GID-Namespace teilnahm. Die eingebettete UID würde dem Server ermöglichen, Zugriffskontrolllisten schnell zu prüfen, ohne einen Round-Trip zu einem Verzeichnisdienst.
- Das Internet wechselte von homogenen POSIX-Umgebungen zu heterogenen Cloud-Architekturen
- Moderne Authentifizierung verwendet Token (JWT, OAuth) statt eingebettete UIDs in Bezeichnern
- UUID v4 (vollständig zufällig) und UUID v7 (zeitgeordnet) decken die praktischen Anwendungsfälle für eindeutige Bezeichner
- DCE/RPC selbst geriet außer Gebrauch
RFC 4122 (2005) enthielt UUID v2 durch Verweis auf die DCE-Spezifikation, ließ aber absichtlich den detaillierten Generierungsalgorithmus aus — mit dem Hinweis, dass er durch DCE und nicht durch die IETF definiert war.
RFC 9562 (2024), das den UUID-Standard aktualisierte, behielt UUID v2 für historische Vollständigkeit bei, wies aber weiterhin auf seine POSIX-spezifische Natur und das Fehlen eines vollständigen Generierungsalgorithmus im IETF-Standard hin.
UUID v2 vs UUID v1
UUID v2 wird von UUID v1 abgeleitet. Hier ist ein Vergleich:
| Aspekt | UUID v1 | UUID v2 |
|---|---|---|
| Zeitstempel-Bits | 60 Bits (~100ns-Präzision) | 28 Bits (~7,2-Minuten-Präzision) |
| Lokaler Bezeichner | Keiner | 32-Bit POSIX UID/GID |
| Lokale Domain | Nicht vorhanden | 0=UID, 1=GID, 2=Org |
| Knotenfeld | MAC-Adresse | MAC-Adresse |
| Bibliotheks-Unterstützung | Weit verbreitet unterstützt | Selten unterstützt |
| Standard | RFC 4122 / RFC 9562 | DCE-Spezifikation (referenziert durch RFC 4122) |
| Praktische Nutzung | Legacy-zeitstempel-geordnete IDs (Cassandra) | Nur DCE-Security-Kontexte |
UUID v2 bietet nichts gegenüber UUID v1 für allgemeine Zwecke und ist in den meisten Aspekten strikt schlechter. Es gibt keinen Grund, UUID v2 für neue Entwicklung zu wählen.
Code-Beispiele
UUID v2 hat keine native Unterstützung in Standard-Bibliotheken. Die folgenden Beispiele zeigen, wie man mit UUID v2-Werten arbeitet:
Python — manuelle Implementierung
import uuid, struct, time
def uuid_v2(local_id: int, local_domain: int = 0) -> str:
"""
Generate a DCE Security UUID (v2).
local_domain: 0 = POSIX UID, 1 = POSIX GID, 2 = Org
local_id: 32-bit unsigned integer (e.g. os.getuid())
"""
# Get a v1 UUID for the time and node fields
v1 = uuid.uuid1()
fields = list(v1.fields) # [time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node]
# Replace time_low with local_id
fields[0] = local_id & 0xFFFFFFFF
# Replace version nibble: clear lower 12 bits of time_hi, set version 2
fields[2] = (fields[2] & 0x0FFF) | 0x2000
# Replace clock_seq_low with local_domain
fields[4] = local_domain & 0xFF
return str(uuid.UUID(fields=tuple(fields)))
import os
print(uuid_v2(os.getuid(), local_domain=0)) # POSIX UID
print(uuid_v2(os.getgid(), local_domain=1)) # POSIX GID
Go — Hinweis
// The standard "github.com/google/uuid" package does NOT support v2. // You would need to implement it manually, similar to the Python example above. // Most Go developers use v4 or v7 for new projects. import "github.com/google/uuid" v4 := uuid.New() // v4 — recommended for most use cases v7, _ := uuid.NewV7() // v7 — time-ordered, ideal for database primary keys
JavaScript — Felder extrahieren
Um local_id und Domain aus einem bestehenden UUID v2-String zu extrahieren:
// Extracting fields from a UUID v2 string
const uuidStr = '000003e8-1234-2abc-8200-a1b2c3d4e5f6'
// ^^^^^^^^ ^^^^ ^ ^^
// local_id ver variant+clockSeqHi
// ^^ = local_domain (00 = POSIX UID)
const parts = uuidStr.split('-')
const localId = parseInt(parts[0], 16) // → 1000 (0x3e8)
const version = parseInt(parts[2][0], 16) // → 2
const localDomain = parseInt(parts[3].slice(2), 16) // low byte of octet pair
const DOMAIN_NAMES = ['POSIX UID', 'POSIX GID', 'Org']
console.log(`Local ID: ${localId}`) // Local ID: 1000
console.log(`Version: ${version}`) // Version: 2
console.log(`Domain: ${DOMAIN_NAMES[localDomain]}`) // Domain: POSIX UID
google/uuid unterstützt UUID v2-Generierung über uuid.NewDCEGroup() und uuid.NewDCEPerson() — eine der wenigen Mainstream-Bibliotheken, die das tun.