UUID v2 Üretici
Yerel alan ve kimlikle DCE Security UUID v2 oluşturur
UUID v2 Nedir?
UUID v2, Dağıtık Hesaplama Ortamı (DCE) spesifikasyonunun bir parçası olarak standartlaştırılan ve RFC 4122'de başvurulan DCE Security UUID sürümüdür. UUID v1'i, zaman damgası alanına POSIX kullanıcı veya grup tanımlayıcısı (UID/GID) gömerek genişletir.
Yapı UUID v1'e benzer, ancak 32 bitlik time_low alanı 32 bitlik yerel tanımlayıcıyla (ör. POSIX UID) değiştirilmiştir.
UUID v2, modern yazılımda son derece nadirdir. Çoğu geliştirici hiçbir zaman bir tane oluşturmaya ihtiyaç duymaz.
UUID v2 Yapısı
UUID v2, diğer UUID sürümleriyle aynı 128 bit, tireli biçime sahiptir. Alanlar UUID v1'den şu şekilde farklıdır:
| Alan | Bit | Amaç |
|---|---|---|
| local_id | 32 | <code>local_id</code> — 32 bitlik yerel alan tanımlayıcısı (ör. <code>/etc/passwd</code>'den POSIX UID), UUID v1'in time_low alanının yerini alır |
| time_mid | 16 | <code>time_mid</code> — kısaltılmış UUID v1 zaman damgasının orta 16 biti |
| time_hi+version | 16 | <code>time_hi_and_version</code> — sürüm nibble'ı <code>2</code> olarak ayarlanmış üst 12 zaman damgası biti |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — varyant bitleri artı saat dizisinin yüksek kısmı |
| local_domain | 8 | <code>local_domain</code> — alan tanımlayıcısı: <code>0</code> = POSIX Kullanıcı (UID), <code>1</code> = POSIX Grup (GID), <code>2</code> = Organizasyon |
| node | 48 | <code>node</code> — oluşturan ana bilgisayarın 48 bitlik MAC adresi |
Örnek: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = POSIX Kullanıcı
Yerel Alan Değerleri
local_domain baytı, UUID'ye gömülü yerel tanımlayıcının türünü belirtir:
Alan değerleri DCE spesifikasyonu tarafından tanımlanır. 3–255 arası değerler ayrılmıştır.
UUID v2 Neden Nadiren Kullanılır
Üç özellik UUID v2'yi çoğu modern uygulama için pratik dışı kılar:
Kaba Zaman Damgası Çözünürlüğü
Zaman damgası 28 bite kısaltılır (yaklaşık 7,2 dakikalık parçalama).
Standart Kitaplık Desteği Yok
UUID v1 ve v4'ün aksine UUID v2, çoğu UUID kitaplığı tarafından desteklenmez.
POSIX'e Özgü Semantikler
Yerel alan kavramı (UID/GID) doğası gereği POSIX'e özgüdür ve Windows, gömülü sistemler veya bulut ortamlarına anlamlı biçimde taşınmaz.
Tarihsel Bağlam
UUID v2, Open Software Foundation'ın Dağıtık Hesaplama Ortamı (DCE/RPC) kapsamında 1990'ların başında tanımlandı.
DCE güvenlik modeli, her düğümün paylaşılan bir UID/GID ad alanına katıldığı homojen bir POSIX ortamını varsayıyordu.
- İnternet, homojen POSIX ortamlarından heterojen bulut mimarilerine geçti
- Modern kimlik doğrulama, tanımlayıcılardaki gömülü UID'ler yerine token'lar (JWT, OAuth) kullanır
- UUID v4 (tamamen rastgele) ve UUID v7 (zaman sıralı), benzersiz tanımlayıcıların pratik kullanım durumlarını karşılar
- DCE/RPC'nin kendisi yaygın kullanımdan çıktı
RFC 4122 (2005), UUID v2'yi DCE spesifikasyonuna atıfla dahil etti ancak ayrıntılı oluşturma algoritmasını kasıtlı olarak atladı.
RFC 9562 (2024), UUID v2'yi tarihsel bütünlük için korudu.
UUID v2 ile UUID v1 Karşılaştırması
UUID v2, UUID v1'den türetilmiştir. Karşılaştırma:
| Konu | UUID v1 | UUID v2 |
|---|---|---|
| Zaman damgası bitleri | 60 bit (~100 ns hassasiyet) | 28 bit (~7,2 dakika hassasiyet) |
| Yerel tanımlayıcı | Yok | 32 bit POSIX UID/GID |
| Yerel alan | Mevcut değil | 0=UID, 1=GID, 2=Org |
| Düğüm alanı | MAC adresi | MAC adresi |
| Kitaplık desteği | Yaygın olarak desteklenir | Nadiren desteklenir |
| Standart | RFC 4122 / RFC 9562 | DCE spesifikasyonu (RFC 4122 tarafından başvurulan) |
| Pratik kullanım | Eski zaman sıralı ID'ler (Cassandra) | Yalnızca DCE Security bağlamları |
UUID v2, genel amaçlı kullanım için UUID v1'e göre hiçbir avantaj sunmaz. Yeni geliştirme için UUID v2'yi seçmenin hiçbir nedeni yoktur.
Kod Örnekleri
UUID v2'nin standart kitaplıklarda yerel desteği yoktur:
Python — manuel uygulama
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 — not
// 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 — alanları ayıklama
Mevcut bir UUID v2 dizesinden local_id ve alan çıkarmak için:
// 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 Go paketi, birkaç ana akım kitaplıktan biri olarak uuid.NewDCEGroup() ve uuid.NewDCEPerson() aracılığıyla UUID v2 oluşturmayı destekler.