UUID v2 Generator

Generate DCE Security UUID v2 with local domain and ID

Klicken Sie auf Generieren, um eine UUID zu erstellen
Hinweis:UUID v2 kodiert die lokale Domain und ID in die UUID-Struktur
Note:UUID v2 ist ein Legacy-Format, das für DCE-Security-Kontexte definiert wurde. Es wird in modernen Anwendungen selten benötigt. Für allgemeine eindeutige IDs wird UUID v4 empfohlen.

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:

FeldBitsZweck
local_id32<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_mid16<code>time_mid</code> — mittlere 16 Bits des abgeschnittenen UUID v1-Zeitstempels
time_hi+version16<code>time_hi_and_version</code> — obere 12 Zeitstempel-Bits mit Versions-Nibble auf <code>2</code> gesetzt
variant+clock_hi8<code>clock_seq_hi_and_reserved</code> — Varianten-Bits plus oberer Teil der Taktsequenz
local_domain8<code>local_domain</code> — Domain-Bezeichner: <code>0</code> = POSIX-Benutzer (UID), <code>1</code> = POSIX-Gruppe (GID), <code>2</code> = Organisation
node48<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

Note:Da das local_id-Feld das time_low-Feld ersetzt, ist der Zeitstempel in UUID v2 nur 28 Bits breit (im Vergleich zu 60 Bits in UUID v1). Dies reduziert die Zeitstempel-Präzision auf ungefähr 7,2 Minuten — UUIDs, die innerhalb desselben 7-Minuten-Fensters vom selben Host/Domain/local_id generiert werden, sind möglicherweise nicht eindeutig.

Lokale Domain-Werte

Das local_domain-Byte gibt den Typ des in der UUID eingebetteten lokalen Bezeichners an:

0POSIX_UID
POSIX-Benutzer-ID — die numerische UID aus <code>/etc/passwd</code>, erhältlich über <code>os.getuid()</code>
1POSIX_GID
POSIX-Gruppen-ID — die numerische GID aus <code>/etc/group</code>, erhältlich über <code>os.getgid()</code>
2ORG
Organisation — ein benutzerdefinierter 32-Bit-organisatorischer Bezeichner; Semantik ist anwendungsdefiniert

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.

Warning:Verwenden Sie UUID v2 nicht für neue Projekte. Das Format bietet keine Vorteile gegenüber UUID v4 oder v7 für allgemeine eindeutige IDs. Wenn Sie auf ein UUID v2 in einem Legacy-System gestoßen sind, verwenden Sie dieses Tool, um seine Felder zu dekodieren. Verwenden Sie für neue Entwicklung UUID v4.

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:

AspektUUID v1UUID v2
Zeitstempel-Bits60 Bits (~100ns-Präzision)28 Bits (~7,2-Minuten-Präzision)
Lokaler BezeichnerKeiner32-Bit POSIX UID/GID
Lokale DomainNicht vorhanden0=UID, 1=GID, 2=Org
KnotenfeldMAC-AdresseMAC-Adresse
Bibliotheks-UnterstützungWeit verbreitet unterstütztSelten unterstützt
StandardRFC 4122 / RFC 9562DCE-Spezifikation (referenziert durch RFC 4122)
Praktische NutzungLegacy-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

Python
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

Go
// 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:

JavaScript
// 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
Note:Das Go-Paket google/uuid unterstützt UUID v2-Generierung über uuid.NewDCEGroup() und uuid.NewDCEPerson() — eine der wenigen Mainstream-Bibliotheken, die das tun.

Häufig gestellte Fragen

Kann ich eine UUID v2 in JavaScript generieren?
Keine Standard-Bibliothek unterstützt UUID v2-Generierung in JavaScript. Sie müssten die Bytes manuell konstruieren: eine UUID v1 nehmen, das time_low-Feld (Bytes 0–3) durch Ihren lokalen Bezeichner ersetzen, Byte 9 auf Ihren Domain-Wert setzen und das Versions-Nibble auf 2 setzen. Dieses Tool generiert keine UUID v2 — es dekodiert sie nur.
Was enthält das local_id-Feld?
Die local_id ist eine vorzeichenlose 32-Bit-Ganzzahl, deren Bedeutung vom local_domain-Byte abhängt. Für Domain 0 ist es die POSIX-UID des Benutzers, der den Prozess ausführt (z. B. 1000 für den ersten Nicht-Root-Benutzer auf einem Linux-System). Für Domain 1 ist es die POSIX-GID. Für Domain 2 ist die Bedeutung anwendungsdefiniert.
Ist der Zeitstempel in einer UUID v2 zuverlässig?
Nur als grober Indikator. Da nur 28 Bits des 60-Bit UUID v1-Zeitstempels beibehalten werden, beträgt die effektive Präzision ungefähr 7,2 Minuten. Sie können eine ungefähre Generierungszeit dekodieren, aber keine präzise. Innerhalb eines 7-Minuten-Fensters werden mehrere UUID v2-Werte mit demselben local_id und Domain vom selben Host identische Zeitstempel haben.
Welche Systeme verwenden noch UUID v2?
UUID v2 wird hauptsächlich in Legacy-DCE/RPC-Systemen aus den 1990er Jahren angetroffen, einigen Versionen von Microsofts DCOM (das auf DCE/RPC basiert) und älterer Distributed-Computing-Middleware. Moderne Systeme verwenden fast universell UUID v4 oder v7.
Warum enthält RFC 4122 nicht den UUID v2-Algorithmus?
RFC 4122 stellt ausdrücklich fest, dass der UUID v2-Generierungsalgorithmus durch die DCE-Spezifikation und nicht durch die IETF definiert wird. Da die IETF keine Autorität über die DCE-Spezifikation hatte, haben sie nur einen Verweis eingefügt. Deshalb lassen die meisten UUID-Bibliotheken, die RFC 4122 folgen, die UUID v2-Unterstützung aus.
Ist UUID v2 dasselbe wie ein GUID?
Nein. GUID (Globally Unique Identifier) ist Microsofts Implementierung des UUID-Standards. Microsoft COM verwendet intern UUID v1 und v4 GUIDs. UUID v2 wird von der Windows-GUID-Infrastruktur nicht verwendet, obwohl beide von denselben DCE/RPC-Ursprüngen abstammen.