UUID v2 Generator
Generate DCE Security UUID v2 with local domain and ID
Wat is UUID v2?
UUID v2 is de DCE Security-UUID-versie, gestandaardiseerd als onderdeel van de Distributed Computing Environment (DCE)-specificatie en waarnaar wordt verwezen in RFC 4122. Het breidt UUID v1 uit door een POSIX-gebruikers- of groepsidentificator (UID/GID) in te bedden in het tijdstempelveld.
De structuur is vergelijkbaar met UUID v1, maar het 32-bit veld time_low wordt vervangen door een 32-bit lokale identificator (bijv. een POSIX-UID) en een 1-byte local_domain-veld identificeert welk soort lokale ID het is. Het tijdstempel wordt als gevolg afgekort, waardoor de precisie en uniciteitsgaranties worden verminderd.
UUID v2 is uiterst zeldzaam in moderne software. De meeste ontwikkelaars zullen het nooit hoeven te genereren. Deze pagina documenteert het formaat voor volledigheid en om te helpen bij het decoderen van UUID v2-waarden in legacy-systemen.
UUID v2-structuur
Een UUID v2 heeft hetzelfde 128-bit, koppeltekens-formaat als andere UUID-versies. De velden verschillen van UUID v1 als volgt:
| Veld | Bits | Doel |
|---|---|---|
| local_id | 32 | <code>local_id</code> — 32-bit lokale domeinidentificator (bijv. POSIX UID uit <code>/etc/passwd</code>), vervangt het time_low-veld van UUID v1 |
| time_mid | 16 | <code>time_mid</code> — middelste 16 bits van het afgekorte UUID v1-tijdstempel |
| time_hi+version | 16 | <code>time_hi_and_version</code> — bovenste 12 tijdstempelbits met versienibble ingesteld op <code>2</code> |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — variantbits plus hoog deel van kloksequentie |
| local_domain | 8 | <code>local_domain</code> — domeinidentificator: <code>0</code> = POSIX-gebruiker (UID), <code>1</code> = POSIX-groep (GID), <code>2</code> = Organisatie |
| node | 48 | <code>node</code> — 48-bit MAC-adres van de genererende host |
Voorbeeld: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = POSIX-gebruiker
Lokale domeinwaarden
Het local_domain-byte specificeert het type lokale identificator ingebed in de UUID:
De domeinwaarden worden gedefinieerd door de DCE-specificatie. Waarden 3–255 zijn gereserveerd. In de praktijk wordt alleen domein 0 (Persoon/UID) veel aangetroffen in echte UUID v2-waarden.
Waarom UUID v2 zelden wordt gebruikt
Drie kenmerken maken UUID v2 onpraktisch voor de meeste moderne toepassingen:
Grove tijdstempelresolutie
Het tijdstempel is afgekort tot 28 bits (ongeveer 7,2-minuten-granulariteit). Binnen dat venster zijn UUIDs gegenereerd met dezelfde local_id en hetzelfde domein op dezelfde host niet uniek — de specificatie vertrouwt op het clock_seq-veld om ze te onderscheiden, waardoor uniciteit wordt beperkt tot 64 waarden per 7-minutenvenster.
Geen standaard bibliotheekondersteuning
In tegenstelling tot UUID v1 en v4 wordt UUID v2 niet ondersteund door de meeste UUID-bibliotheken. Het npm-pakket uuid, de Python-module uuid en Java's java.util.UUID laten v2 allemaal weg. Aangepaste implementatie is vereist.
POSIX-specifieke semantiek
Het lokale domeinconcept (UID/GID) is inherent POSIX-specifiek en vertaalt zich niet zinvol naar Windows, ingebedde systemen of cloudomgevingen waar het concept van een POSIX-gebruikers-ID ontbreekt.
Historische context
UUID v2 werd gedefinieerd als onderdeel van de Distributed Computing Environment (DCE/RPC) van de Open Software Foundation in de vroege jaren 1990. Het doel was om UUIDs te creëren die autorisatiecontext kunnen dragen — specifiek om een RPC-server in staat te stellen de aanroepende gebruiker te identificeren zonder een afzonderlijke authenticatiestap.
Het DCE-beveiligingsmodel nam een homogene POSIX-omgeving aan waar elk knooppunt deelnam aan een gedeelde UID/GID-naamruimte. De ingebedde UID zou de server in staat stellen toegangscontrolelijsten snel te controleren zonder een round-trip naar een directoryservice.
- Het internet bewoog weg van homogene POSIX-omgevingen naar heterogene cloudarchitecturen
- Moderne authenticatie gebruikt tokens (JWT, OAuth) in plaats van ingebedde UIDs in identificatoren
- UUID v4 (volledig willekeurig) en UUID v7 (tijdgeordend) dekken de praktische gebruiksscenario's voor unieke identificatoren
- DCE/RPC zelf raakte buiten gebruik
RFC 4122 (2005) bevatte UUID v2 door verwijzing naar de DCE-specificatie, maar liet bewust het gedetailleerde generatiealgoritme weg — opmerkend dat het werd gedefinieerd door DCE en niet door de IETF.
RFC 9562 (2024), dat de UUID-standaard bijwerkte, behield UUID v2 voor historische volledigheid maar bleef de POSIX-specifieke aard en het ontbreken van een volledig generatiealgoritme in de IETF-standaard opmerken.
UUID v2 vs UUID v1
UUID v2 is afgeleid van UUID v1. Hier is een vergelijking:
| Aspect | UUID v1 | UUID v2 |
|---|---|---|
| Tijdstempelbits | 60 bits (~100ns precisie) | 28 bits (~7,2-minuten precisie) |
| Lokale identificator | Geen | 32-bit POSIX UID/GID |
| Lokaal domein | Niet aanwezig | 0=UID, 1=GID, 2=Org |
| Knooppuntveld | MAC-adres | MAC-adres |
| Bibliotheekondersteuning | Breed ondersteund | Zelden ondersteund |
| Standaard | RFC 4122 / RFC 9562 | DCE-specificatie (waarnaar verwezen door RFC 4122) |
| Praktisch gebruik | Legacy tijdstempelgeordende ID's (Cassandra) | Alleen DCE Security-contexten |
UUID v2 biedt niets ten opzichte van UUID v1 voor algemeen gebruik en is in de meeste opzichten strikt slechter. Er is geen reden om UUID v2 te kiezen voor nieuwe ontwikkeling.
Codevoorbeelden
UUID v2 heeft geen native ondersteuning in standaard bibliotheken. De volgende voorbeelden tonen hoe te werken met UUID v2-waarden:
Python — handmatige implementatie
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 — opmerking
// 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 — velden extraheren
Om local_id en domein te extraheren uit een bestaande UUID v2-string:
// 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 ondersteunt UUID v2-generatie via uuid.NewDCEGroup() en uuid.NewDCEPerson() — een van de weinige mainstream bibliotheken die dat doen.