UUID v2 Generator

Generate DCE Security UUID v2 with local domain and ID

Klik op Genereren om een UUID te maken
Opmerking:UUID v2 codeert het lokale domein en de ID in de UUID-structuur
Note:UUID v2 is een legacy-formaat gedefinieerd voor DCE Security-contexten. Het is zelden nodig in moderne toepassingen. Voor algemene unieke ID's wordt UUID v4 aanbevolen.

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:

VeldBitsDoel
local_id32<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_mid16<code>time_mid</code> — middelste 16 bits van het afgekorte UUID v1-tijdstempel
time_hi+version16<code>time_hi_and_version</code> — bovenste 12 tijdstempelbits met versienibble ingesteld op <code>2</code>
variant+clock_hi8<code>clock_seq_hi_and_reserved</code> — variantbits plus hoog deel van kloksequentie
local_domain8<code>local_domain</code> — domeinidentificator: <code>0</code> = POSIX-gebruiker (UID), <code>1</code> = POSIX-groep (GID), <code>2</code> = Organisatie
node48<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

Note:Omdat het local_id-veld het time_low-veld vervangt, is het tijdstempel in UUID v2 slechts 28 bits breed (vergeleken met 60 bits in UUID v1). Dit vermindert de tijdstempelprecisie tot ongeveer 7,2 minuten — UUIDs gegenereerd binnen hetzelfde 7-minutenvenster van dezelfde host/domein/local_id-combinatie zijn mogelijk niet uniek.

Lokale domeinwaarden

Het local_domain-byte specificeert het type lokale identificator ingebed in de UUID:

0POSIX_UID
POSIX-gebruikers-ID — de numerieke UID uit <code>/etc/passwd</code>, te verkrijgen via <code>os.getuid()</code>
1POSIX_GID
POSIX-groeps-ID — de numerieke GID uit <code>/etc/group</code>, te verkrijgen via <code>os.getgid()</code>
2ORG
Organisatie — een aangepaste 32-bit organisatorische identificator; semantiek is applicatie-gedefinieerd

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.

Warning:Gebruik UUID v2 niet voor nieuwe projecten. Het formaat biedt geen voordelen ten opzichte van UUID v4 of v7 voor algemene unieke ID's. Als u een UUID v2 in een legacy-systeem hebt aangetroffen, gebruik dit hulpmiddel om de velden te decoderen. Gebruik voor nieuwe ontwikkeling UUID v4.

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:

AspectUUID v1UUID v2
Tijdstempelbits60 bits (~100ns precisie)28 bits (~7,2-minuten precisie)
Lokale identificatorGeen32-bit POSIX UID/GID
Lokaal domeinNiet aanwezig0=UID, 1=GID, 2=Org
KnooppuntveldMAC-adresMAC-adres
BibliotheekondersteuningBreed ondersteundZelden ondersteund
StandaardRFC 4122 / RFC 9562DCE-specificatie (waarnaar verwezen door RFC 4122)
Praktisch gebruikLegacy 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

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 — opmerking

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 — velden extraheren

Om local_id en domein te extraheren uit een bestaande UUID v2-string:

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:Het Go-pakket google/uuid ondersteunt UUID v2-generatie via uuid.NewDCEGroup() en uuid.NewDCEPerson() — een van de weinige mainstream bibliotheken die dat doen.

Veelgestelde vragen

Kan ik een UUID v2 genereren in JavaScript?
Geen standaard bibliotheek ondersteunt UUID v2-generatie in JavaScript. U zou de bytes handmatig moeten construeren: neem een UUID v1, vervang het time_low-veld (bytes 0–3) door uw lokale identificator, stel byte 9 in op uw domeinwaarde en stel het versienibble in op 2. Dit hulpmiddel genereert geen UUID v2 — het decodeert ze alleen.
Wat bevat het local_id-veld?
De local_id is een ongetekend 32-bit integer waarvan de betekenis afhangt van het local_domain-byte. Voor domein 0 is het de POSIX-UID van de gebruiker die het proces uitvoert (bijv. 1000 voor de eerste niet-root-gebruiker op een Linux-systeem). Voor domein 1 is het de POSIX-GID. Voor domein 2 is de betekenis applicatie-gedefinieerd.
Is het tijdstempel in een UUID v2 betrouwbaar?
Alleen als ruwe indicator. Omdat slechts 28 bits van het 60-bit UUID v1-tijdstempel worden bewaard, is de effectieve precisie ongeveer 7,2 minuten. U kunt een benaderende generatietijd decoderen, maar geen precieze. Binnen een 7-minutenvenster zullen meerdere UUID v2-waarden met dezelfde local_id en hetzelfde domein van dezelfde host identieke tijdstempels hebben.
Welke systemen gebruiken nog UUID v2?
UUID v2 wordt voornamelijk aangetroffen in legacy DCE/RPC-systemen uit de jaren 1990, sommige versies van Microsofts DCOM (dat is gebaseerd op DCE/RPC), en oudere gedistribueerde computermiddleware. Moderne systemen gebruiken bijna universeel UUID v4 of v7.
Waarom bevat RFC 4122 niet het UUID v2-algoritme?
RFC 4122 stelt uitdrukkelijk dat het UUID v2-generatiealgoritme wordt gedefinieerd door de DCE-specificatie, niet door de IETF. Omdat de IETF geen autoriteit had over de DCE-specificatie, hebben ze alleen een verwijzing opgenomen. Dit is de reden dat de meeste UUID-bibliotheken die RFC 4122 volgen, UUID v2-ondersteuning weglaten.
Is UUID v2 hetzelfde als een GUID?
Nee. GUID (Globally Unique Identifier) is Microsofts naam voor hetzelfde concept. Microsoft COM gebruikt intern UUID v1 en v4 GUIDs. UUID v2 wordt niet gebruikt door de Windows GUID-infrastructuur, ondanks dat beide voortkomen uit dezelfde DCE/RPC-oorsprong.