ToolDeck

UUID v2 Generator

Generate DCE Security UUID v2 with local domain and ID

Click Generate to create a UUID
Note:UUID v2 encodes the local domain and ID into the UUID structure
Note:UUID v2 یک فرمت قدیمی است که برای زمینه‌های امنیتی DCE تعریف شده. در برنامه‌های مدرن به‌ندرت مورد نیاز است. برای شناسه‌های یکتای عمومی، UUID v4 توصیه می‌شود.

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_id32<code>local_id</code> — شناسه ۳۲ بیتی دامنه محلی (مثلاً POSIX UID از <code>/etc/passwd</code>)، جایگزین فیلد time_low در UUID v1
time_mid16<code>time_mid</code> — ۱۶ بیت میانی تایم‌استمپ کوتاه‌شده UUID v1
time_hi+version16<code>time_hi_and_version</code> — ۱۲ بیت بالایی تایم‌استمپ با nibble نسخه تنظیم‌شده روی <code>2</code>
variant+clock_hi8<code>clock_seq_hi_and_reserved</code> — بیت‌های نوع به علاوه بخش بالایی دنباله ساعت
local_domain8<code>local_domain</code> — شناسه دامنه: <code>0</code> = POSIX User (UID)، <code>1</code> = POSIX Group (GID)، <code>2</code> = سازمان
node48<code>node</code> — آدرس MAC ۴۸ بیتی میزبان تولیدکننده

مثال: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000، local_domain 0x00 = POSIX User

Note:از آنجا که فیلد local_id جایگزین فیلد time_low می‌شود، تایم‌استمپ UUID v2 تنها ۲۸ بیت عرض دارد (در مقایسه با ۶۰ بیت در UUID v1). این دقت تایم‌استمپ را به تقریباً ۷.۲ دقیقه کاهش می‌دهد — UUID‌هایی که در همان بازه ۷ دقیقه‌ای از همان ترکیب میزبان/دامنه/local_id تولید می‌شوند ممکن است یکتا نباشند.

مقادیر دامنه محلی

بایت local_domain نوع شناسه محلی جاسازی‌شده در UUID را مشخص می‌کند:

0POSIX_UID
POSIX User ID — UID عددی از <code>/etc/passwd</code>، قابل دریافت از طریق <code>os.getuid()</code>
1POSIX_GID
POSIX Group ID — GID عددی از <code>/etc/group</code>، قابل دریافت از طریق <code>os.getgid()</code>
2ORG
سازمان — یک شناسه سازمانی ۳۲ بیتی سفارشی؛ معنای آن توسط برنامه تعریف می‌شود

مقادیر دامنه توسط مشخصات 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 در آن‌ها وجود ندارد، معنادار نیست.

Warning:از UUID v2 برای پروژه‌های جدید استفاده نکنید. این فرمت هیچ مزیتی نسبت به UUID v4 یا v7 برای شناسه‌های یکتای عمومی ندارد. اگر در یک سیستم قدیمی با UUID v2 مواجه شدید، از این ابزار برای رمزگشایی فیلدهای آن استفاده کنید. برای توسعه جدید، از UUID v4 استفاده کنید.

زمینه تاریخی

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 v1UUID 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 — پیاده‌سازی دستی

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

Go
// "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 موجود:

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:پکیج Go با نام google/uuid یکی از معدود کتابخانه‌های اصلی با پشتیبانی بومی UUID v2 است. اکثر دیگران (npm uuid، ماژول uuid پایتون، java.util.UUID جاوا) آن را به‌کلی حذف کرده‌اند.

سوالات متداول

آیا می‌توانم UUID v2 در JavaScript تولید کنم؟
هیچ کتابخانه استانداردی از تولید UUID v2 در JavaScript پشتیبانی نمی‌کند. باید بایت‌ها را به صورت دستی بسازید: یک UUID v1 بگیرید، فیلد time_low (بایت‌های ۰ تا ۳) را با شناسه محلی خود جایگزین کنید، بایت ۹ را روی مقدار دامنه خود تنظیم کنید و nibble نسخه را روی ۲ قرار دهید. این ابزار UUID v2 تولید نمی‌کند — فقط آن‌ها را رمزگشایی می‌کند.
فیلد local_id چه محتوایی دارد؟
local_id یک عدد صحیح بدون علامت ۳۲ بیتی است که معنای آن به بایت local_domain بستگی دارد. برای دامنه ۰، POSIX UID کاربری است که فرآیند را اجرا می‌کند (مثلاً ۱۰۰۰ برای اولین کاربر غیر root در یک سیستم Linux). برای دامنه ۱، POSIX GID است. برای دامنه ۲، معنا توسط برنامه تعریف می‌شود.
آیا تایم‌استمپ در UUID v2 قابل اعتماد است؟
تنها به عنوان یک شاخص تقریبی. از آنجا که تنها ۲۸ بیت از تایم‌استمپ ۶۰ بیتی UUID v1 حفظ می‌شود، دقت مؤثر تقریباً ۷.۲ دقیقه است. می‌توانید زمان تولید تقریبی را رمزگشایی کنید، اما نه یک زمان دقیق. در یک بازه ۷ دقیقه‌ای، چند مقدار UUID v2 با همان local_id و دامنه از همان میزبان تایم‌استمپ‌های یکسانی خواهند داشت.
کدام سیستم‌ها هنوز از UUID v2 استفاده می‌کنند؟
UUID v2 عمدتاً در سیستم‌های قدیمی DCE/RPC از دهه ۱۹۹۰، برخی نسخه‌های DCOM مایکروسافت (که مبتنی بر DCE/RPC است) و نرم‌افزار میانی محاسبات توزیع‌شده قدیمی‌تر یافت می‌شود. سیستم‌های مدرن تقریباً به طور همگانی از UUID v4 یا v7 استفاده می‌کنند.
چرا RFC 4122 الگوریتم UUID v2 را شامل نمی‌شود؟
RFC 4122 به صراحت بیان می‌کند که الگوریتم تولید UUID v2 توسط مشخصات DCE تعریف شده، نه IETF. از آنجا که IETF بر مشخصات DCE هیچ اختیاری نداشت، تنها یک ارجاع را گنجاند. به همین دلیل اکثر کتابخانه‌های UUID که از RFC 4122 پیروی می‌کنند از پشتیبانی UUID v2 صرف نظر می‌کنند.
آیا UUID v2 همان GUID است؟
خیر. GUID (Globally Unique Identifier) پیاده‌سازی مایکروسافت از استاندارد UUID است. Microsoft COM به صورت داخلی از GUID‌های UUID v1 و v4 استفاده می‌کند. UUID v2 توسط زیرساخت GUID ویندوز استفاده نمی‌شود، علی‌رغم اینکه هر دو از همان ریشه‌های DCE/RPC مشتق شده‌اند.