UUID v2 چیست؟
UUID v2 نسخه امنیت DCE از UUID است که به عنوان بخشی از مشخصات Distributed Computing Environment (DCE) استانداردسازی شده و در RFC 4122 ارجاع داده شده است. این نسخه UUID v1 را با جاسازی شناسه کاربر یا گروه POSIX (UID/GID) در فیلد تایماستمپ گسترش میدهد.
ساختار آن مشابه UUID v1 است، اما فیلد ۳۲ بیتی time_low با یک شناسه محلی ۳۲ بیتی (مانند POSIX UID) جایگزین میشود و یک فیلد یکبایتی local_domain نوع شناسه محلی را مشخص میکند. در نتیجه تایماستمپ کوتاه میشود و دقت و ضمانت یکتایی آن کاهش مییابد.
UUID v2 در نرمافزارهای مدرن بسیار نادر است. اکثر توسعهدهندگان هرگز نیازی به تولید آن نخواهند داشت. این صفحه فرمت را به عنوان مرجع مستند کرده و به رمزگشایی مقادیر UUID v2 در سیستمهای قدیمی کمک میکند.
ساختار UUID v2
یک UUID v2 همان فرمت ۱۲۸ بیتی خطفاصلهدار سایر نسخههای UUID را دارد. فیلدها در مقایسه با UUID v1 به شرح زیر متفاوت هستند:
| فیلد | بیتها | هدف |
|---|---|---|
| local_id | 32 | <code>local_id</code> — شناسه ۳۲ بیتی دامنه محلی (مثلاً POSIX UID از <code>/etc/passwd</code>)، جایگزین فیلد time_low در UUID v1 |
| time_mid | 16 | <code>time_mid</code> — ۱۶ بیت میانی تایماستمپ کوتاهشده UUID v1 |
| time_hi+version | 16 | <code>time_hi_and_version</code> — ۱۲ بیت بالایی تایماستمپ با nibble نسخه تنظیمشده روی <code>2</code> |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — بیتهای نوع به علاوه بخش بالایی دنباله ساعت |
| local_domain | 8 | <code>local_domain</code> — شناسه دامنه: <code>0</code> = POSIX User (UID)، <code>1</code> = POSIX Group (GID)، <code>2</code> = سازمان |
| node | 48 | <code>node</code> — آدرس MAC ۴۸ بیتی میزبان تولیدکننده |
مثال: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000، local_domain 0x00 = POSIX User
مقادیر دامنه محلی
بایت local_domain نوع شناسه محلی جاسازیشده در UUID را مشخص میکند:
مقادیر دامنه توسط مشخصات DCE تعریف شدهاند. مقادیر ۳ تا ۲۵۵ رزرو شدهاند. در عمل، تنها دامنه 0 (Person/UID) در مقادیر UUID v2 واقعی متداول است.
چرا UUID v2 بهندرت استفاده میشود
سه ویژگی UUID v2 را برای اکثر برنامههای مدرن ناکارآمد میکند:
دقت درشت تایماستمپ
تایماستمپ به ۲۸ بیت کوتاه میشود (تقریباً دقت ۷.۲ دقیقهای). در آن بازه، UUIDهایی که با همان local_id و دامنه روی همان میزبان تولید میشوند یکتا نیستند — مشخصات برای متمایز کردن آنها به فیلد clock_seq متکی است که یکتایی را به ۶۴ مقدار در هر بازه ۷ دقیقهای محدود میکند.
پشتیبانی نداشتن کتابخانههای استاندارد
برخلاف UUID v1 و v4، UUID v2 توسط اکثر کتابخانههای UUID پشتیبانی نمیشود. پکیج npm با نام uuid، ماژول uuid پایتون و java.util.UUID جاوا همه v2 را حذف کردهاند. پیادهسازی سفارشی الزامی است.
معناشناسی اختصاصی POSIX
مفهوم دامنه محلی (UID/GID) ذاتاً مختص POSIX است و در محیطهای ویندوز، سیستمهای تعبیهشده یا محیطهای ابری که مفهوم POSIX user ID در آنها وجود ندارد، معنادار نیست.
زمینه تاریخی
UUID v2 به عنوان بخشی از Distributed Computing Environment (DCE/RPC) بنیاد نرمافزار باز در اوایل دهه ۱۹۹۰ تعریف شد. هدف ایجاد UUIDهایی بود که بتوانند زمینه مجوزدهی را حمل کنند — به طور خاص، تا سرور RPC بتواند کاربر فراخوان را بدون مرحله احراز هویت جداگانه شناسایی کند.
مدل امنیتی DCE یک محیط POSIX همگن را فرض میکرد که در آن هر گره در یک فضای نام UID/GID مشترک شرکت میکند. UID جاسازیشده به سرور اجازه میداد فهرستهای کنترل دسترسی را بدون رفتوبرگشت به یک سرویس دایرکتوری به سرعت بررسی کند.
- اینترنت از محیطهای POSIX همگن به سمت معماریهای ابری ناهمگن حرکت کرد
- احراز هویت مدرن از توکنها (JWT، OAuth) به جای UIDهای جاسازیشده در شناسهها استفاده میکند
- UUID v4 (کاملاً تصادفی) و UUID v7 (مرتبشده بر اساس زمان) موارد استفاده عملی شناسههای یکتا را پوشش میدهند
- خود DCE/RPC از کاربرد گسترده خارج شد
RFC 4122 (2005) UUID v2 را با ارجاع به مشخصات DCE گنجاند، اما عمداً الگوریتم تولید تفصیلی را حذف کرد — با این توضیح که توسط DCE نه IETF تعریف شده است.
RFC 9562 (2024) که استاندارد UUID را بهروز کرد، UUID v2 را برای کامل بودن تاریخی حفظ کرد اما همچنان به ماهیت اختصاصی POSIX آن و نبود یک الگوریتم تولید کامل در استاندارد IETF اشاره کرد.
UUID v2 در مقابل UUID v1
UUID v2 از UUID v1 مشتق شده است. در اینجا مقایسه آنها آمده است:
| جنبه | UUID v1 | UUID v2 |
|---|---|---|
| بیتهای تایماستمپ | ۶۰ بیت (~دقت ۱۰۰ نانوثانیه) | ۲۸ بیت (~دقت ۷.۲ دقیقه) |
| شناسه محلی | ندارد | POSIX UID/GID 32 بیتی |
| دامنه محلی | ندارد | 0=UID, 1=GID, 2=Org |
| فیلد node | آدرس MAC | آدرس MAC |
| پشتیبانی کتابخانه | پشتیبانی گسترده | پشتیبانی نادر |
| استاندارد | RFC 4122 / RFC 9562 | مشخصات DCE (ارجاعشده توسط RFC 4122) |
| کاربرد عملی | شناسههای قدیمی مرتبشده بر اساس زمان (Cassandra) | تنها در زمینههای امنیتی DCE |
UUID v2 برای استفاده عمومی هیچ مزیتی نسبت به UUID v1 ندارد و در اکثر جنبهها به طور قطعی ضعیفتر است. هیچ دلیلی برای انتخاب UUID v2 در توسعه جدید وجود ندارد.
مثالهای کد
UUID v2 در کتابخانههای استاندارد پشتیبانی بومی ندارد. مثالهای زیر نحوه کار با مقادیر UUID v2 را نشان میدهند:
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 — google/uuid
// "github.com/google/uuid" supports DCE (v2) via two helper functions: import "github.com/google/uuid" v2Person := uuid.NewDCEPerson() // v2, local_domain=0, local_id=os.Getuid() v2Group := uuid.NewDCEGroup() // v2, local_domain=1, local_id=os.Getgid() // For most new projects, prefer: v4 := uuid.New() // v4 — random, universally supported v7, _ := uuid.NewV7() // v7 — time-ordered, good for database primary keys
JavaScript — استخراج فیلدها
برای استخراج local_id و دامنه از یک رشته UUID v2 موجود:
// 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 یکی از معدود کتابخانههای اصلی با پشتیبانی بومی UUID v2 است. اکثر دیگران (npm uuid، ماژول uuid پایتون، java.util.UUID جاوا) آن را بهکلی حذف کردهاند.