UUID v2 Generator
Menghasilkan UUID v2 DCE Security dengan domain lokal dan ID
Apa itu UUID v2?
UUID v2 adalah versi UUID DCE Security, yang distandarisasi sebagai bagian dari spesifikasi Distributed Computing Environment (DCE) dan direferensikan dalam RFC 4122.
Strukturnya mirip dengan UUID v1, tetapi field time_low 32-bit digantikan oleh identifier lokal 32-bit (misalnya POSIX UID).
UUID v2 sangat jarang dalam perangkat lunak modern. Sebagian besar pengembang tidak akan pernah perlu membuatnya.
Struktur UUID v2
UUID v2 memiliki format 128-bit bertanda hubung yang sama seperti versi UUID lainnya. Field-nya berbeda dari UUID v1 sebagai berikut:
| Field | Bit | Tujuan |
|---|---|---|
| local_id | 32 | <code>local_id</code> — identifier domain lokal 32-bit (misalnya POSIX UID dari <code>/etc/passwd</code>), menggantikan field time_low UUID v1 |
| time_mid | 16 | <code>time_mid</code> — 16 bit tengah dari timestamp UUID v1 yang terpotong |
| time_hi+version | 16 | <code>time_hi_and_version</code> — 12 bit timestamp atas dengan nibble versi disetel ke <code>2</code> |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — bit varian plus bagian tinggi urutan jam |
| local_domain | 8 | <code>local_domain</code> — identifier domain: <code>0</code> = Pengguna POSIX (UID), <code>1</code> = Grup POSIX (GID), <code>2</code> = Organisasi |
| node | 48 | <code>node</code> — alamat MAC 48-bit dari host yang menghasilkan |
Contoh: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = Pengguna POSIX
Nilai Domain Lokal
Byte local_domain menentukan tipe identifier lokal yang tertanam dalam UUID:
Nilai domain didefinisikan oleh spesifikasi DCE. Nilai 3–255 dicadangkan. Dalam praktiknya, hanya domain 0 (Orang/UID) yang umum ditemui.
Mengapa UUID v2 Jarang Digunakan
Tiga karakteristik membuat UUID v2 tidak praktis untuk sebagian besar aplikasi modern:
Resolusi Timestamp Kasar
Timestamp terpotong menjadi 28 bit (granularitas sekitar 7,2 menit).
Tidak Ada Dukungan Library Standar
Tidak seperti UUID v1 dan v4, UUID v2 tidak didukung oleh sebagian besar library UUID.
Semantik Khusus POSIX
Konsep domain lokal (UID/GID) secara inheren khusus POSIX dan tidak diterjemahkan secara bermakna ke Windows atau lingkungan cloud.
Konteks Historis
UUID v2 didefinisikan sebagai bagian dari Distributed Computing Environment (DCE/RPC) Open Software Foundation pada awal 1990-an.
Model keamanan DCE mengasumsikan lingkungan POSIX yang homogen di mana setiap node berpartisipasi dalam namespace UID/GID bersama.
- Internet beralih dari lingkungan POSIX homogen ke arsitektur cloud heterogen
- Otentikasi modern menggunakan token (JWT, OAuth) bukan UID yang tertanam dalam identifier
- UUID v4 (sepenuhnya acak) dan UUID v7 (berurutan waktu) mencakup kasus penggunaan praktis untuk identifier unik
- DCE/RPC sendiri sudah tidak banyak digunakan
RFC 4122 (2005) menyertakan UUID v2 dengan referensi ke spesifikasi DCE.
RFC 9562 (2024) mempertahankan UUID v2 untuk kelengkapan historis.
UUID v2 vs UUID v1
UUID v2 diturunkan dari UUID v1. Berikut perbandingannya:
| Aspek | UUID v1 | UUID v2 |
|---|---|---|
| Bit timestamp | 60 bit (presisi ~100ns) | 28 bit (presisi ~7,2 menit) |
| Identifier lokal | Tidak ada | POSIX UID/GID 32-bit |
| Domain lokal | Tidak ada | 0=UID, 1=GID, 2=Org |
| Field node | Alamat MAC | Alamat MAC |
| Dukungan library | Didukung secara luas | Jarang didukung |
| Standar | RFC 4122 / RFC 9562 | Spesifikasi DCE (direferensikan oleh RFC 4122) |
| Penggunaan praktis | ID berurutan timestamp warisan (Cassandra) | Hanya konteks DCE Security |
UUID v2 tidak menawarkan apapun dibanding UUID v1 untuk penggunaan tujuan umum. Tidak ada alasan untuk memilih UUID v2 untuk pengembangan baru.
Contoh Kode
UUID v2 tidak memiliki dukungan native di library standar:
Python — implementasi manual
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 — catatan
// 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 — ekstrak field
Untuk mengekstrak local_id dan domain dari string UUID v2 yang ada:
// 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 mendukung pembuatan UUID v2 melalui uuid.NewDCEGroup() dan uuid.NewDCEPerson().