مولّد UUID v2

يولد UUID v2 لأمان DCE مع النطاق المحلي والمعرف

انقر على توليد لإنشاء UUID
ملاحظة:يُشفّر UUID v2 النطاق المحلي والمعرّف في بنية UUID
Note:UUID v2 تنسيق قديم معرَّف لسياقات DCE Security. نادراً ما يُحتاج في التطبيقات الحديثة. للمعرّفات الفريدة للأغراض العامة، يُوصَى بـ UUID v4.

ما هو UUID v2؟

UUID v2 هو إصدار UUID DCE Security، موحَّد كجزء من مواصفة بيئة الحوسبة الموزّعة (DCE) ومُشار إليه في RFC 4122. يوسّع UUID v1 بتضمين معرّف مستخدم أو مجموعة POSIX (UID/GID) في حقل الطابع الزمني.

البنية مماثلة لـ UUID v1، لكن حقل time_low البالغ 32 بت يُستبدَل بـ معرّف محلي 32 بت (مثلاً POSIX UID) وحقل local_domain بحجم بايت واحد يحدّد نوع المعرّف المحلي. يُبتَر الطابع الزمني نتيجةً لذلك، مما يقلّل دقّته وضمانات تفرّده.

UUID v2 نادر للغاية في البرمجيات الحديثة. معظم المطوّرين لن يحتاجوا أبداً لتوليد واحد. توثّق هذه الصفحة التنسيق للاكتمال ولمساعدة في فكّ ترميز قيم UUID v2 المصادَفة في الأنظمة القديمة.

بنية UUID v2

UUID v2 لديه صيغة 128 بت بواصلات ذاتها كسائر إصدارات UUID. تختلف الحقول عن UUID v1 كما يلي:

الحقلالبتاتالغرض
local_id32<code>local_id</code> — معرّف النطاق المحلي 32 بت (مثلاً POSIX UID من <code>/etc/passwd</code>)، يحلّ محل حقل time_low في UUID v1
time_mid16<code>time_mid</code> — الـ 16 بت الوسطى للطابع الزمني المبتور لـ UUID v1
time_hi+version16<code>time_hi_and_version</code> — أعلى 12 بت للطابع الزمني مع نيبل الإصدار مضبوطاً على <code>2</code>
variant+clock_hi8<code>clock_seq_hi_and_reserved</code> — بتات المتغيّر بالإضافة إلى الجزء العلوي من تسلسل الساعة
local_domain8<code>local_domain</code> — معرّف النطاق: <code>0</code> = مستخدم POSIX (UID)، <code>1</code> = مجموعة POSIX (GID)، <code>2</code> = مؤسسة
node48<code>node</code> — معرّف العقدة 48 بت — عادةً عنوان MAC للمضيف المولِّد

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

Note:لأن حقل local_id يحلّ محل حقل time_low، يبلغ عرض الطابع الزمني في UUID v2 28 بتاً فقط (مقارنةً بـ 60 بتاً في UUID v1). هذا يقلّل دقة الطابع الزمني إلى ما يقارب 7.2 دقائق — UUID المولَّدة خلال نافذة 7 دقائق ذاتها من المضيف/النطاق/local_id المطابقة قد لا تكون فريدة.

قيم النطاق المحلي

بايت local_domain يحدّد نوع المعرّف المحلي المضمَّن في UUID:

0POSIX_UID
معرّف مستخدم POSIX — UID الرقمي من <code>/etc/passwd</code>، يمكن الحصول عليه عبر <code>os.getuid()</code>
1POSIX_GID
معرّف مجموعة POSIX — GID الرقمي من <code>/etc/group</code>، يمكن الحصول عليه عبر <code>os.getgid()</code>
2ORG
مؤسسة — معرّف مؤسسي مخصَّص 32 بت؛ الدلالة محدَّدة من قِبَل التطبيق

قيم النطاق معرَّفة بمواصفة DCE. القيم من 3 إلى 255 محجوزة. عملياً، يُصادَف النطاق 0 (Person/UID) فقط في قيم UUID v2 الواقعية.

لماذا UUID v2 نادر الاستخدام

ثلاث خصائص تجعل UUID v2 غير عملي لمعظم التطبيقات الحديثة:

دقة طابع زمني خشنة

يُبتَر الطابع الزمني إلى 28 بتاً (تقريباً دقة 7.2 دقائق). داخل تلك النافذة، UUID المولَّدة بنفس local_id والنطاق على المضيف ذاته ليست فريدة — تعتمد المواصفة على حقل clock_seq للتمييز بينها، مما يحدّ التفرّد بـ 64 قيمة لكل نافذة 7 دقائق.

لا دعم لمكتبات قياسية

خلافاً لـ UUID v1 وv4، لا تدعم معظم مكتبات UUID توليد UUID v2. حزمة uuid npm وحدة Python's uuid وJava's java.util.UUID تحذف جميعها v2. يتطلب الأمر تطبيقاً مخصَّصاً.

دلالات خاصة بـ POSIX

مفهوم النطاق المحلي (UID/GID) هو بطبيعته خاص بـ POSIX ولا ينتقل بمعنى مفيد إلى Windows أو الأنظمة المضمَّنة أو بيئات السحابة حيث غياب مفهوم معرّف مستخدم POSIX.

Warning:لا تستخدم UUID v2 للمشاريع الجديدة. التنسيق لا يوفّر أي مزايا على UUID v4 أو v7 للمعرّفات الفريدة للأغراض العامة. إذا صادفت UUID v2 في نظام قديم، استخدم هذه الأداة لفكّ ترميز حقوله. للتطوير الجديد، استخدم UUID v4.

السياق التاريخي

عُرِّف UUID v2 كجزء من بيئة الحوسبة الموزّعة لمؤسسة Open Software Foundation (DCE/RPC) في أوائل التسعينيات. كان الهدف إنشاء UUID تستطيع حمل سياق التفويض — تحديداً لتمكين خادم RPC من تحديد المستخدم المتصل دون خطوة مصادقة منفصلة.

افترض نموذج أمان DCE بيئة POSIX متجانسة حيث تشارك كل عقدة في فضاء أسماء UID/GID مشترك. UID المضمَّن سيتيح للخادم فحص قوائم التحكم بالوصول بسرعة دون رحلة ذهاباً وإياباً إلى خدمة الدليل.

  • تحرّك الإنترنت بعيداً عن بيئات POSIX المتجانسة نحو بنى سحابية متغايرة
  • تستخدم المصادقة الحديثة الرموز (JWT وOAuth) بدلاً من UIDs المضمَّنة في المعرّفات
  • 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
بتات الطابع الزمني60 بتاً (~دقة 100 نانوثانية)28 بتاً (~دقة 7.2 دقائق)
المعرّف المحليلا يوجدPOSIX UID/GID بحجم 32 بت
النطاق المحليغير موجود0=UID, 1=GID, 2=Org
حقل العقدةعنوان MACعنوان MAC
دعم المكتباتمدعوم على نطاق واسعنادراً ما يُدعَم
المعيارRFC 4122 / RFC 9562مواصفة DCE (مُشار إليها في RFC 4122)
الاستخدام العمليمعرّفات مرتّبة زمنياً قديمة (Cassandra)سياقات DCE Security فقط

لا يوفّر 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 — ملاحظة

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 — استخراج الحقول

لاستخراج 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:حزمة google/uuid Go تدعم توليد UUID v2 عبر uuid.NewDCEGroup() وuuid.NewDCEPerson() — إحدى المكتبات السائدة القليلة التي تفعل ذلك.

الأسئلة الشائعة

هل يمكنني توليد UUID v2 في JavaScript؟
لا توجد مكتبة قياسية تدعم توليد UUID v2 في JavaScript. ستحتاج لبناء البايتات يدوياً: خذ UUID v1 واستبدل حقل time_low (البايتات 0-3) بمعرّفك المحلي، واضبط البايت 9 على قيمة نطاقك، واضبط نيبل الإصدار على 2. هذه الأداة لا تولّد UUID v2 — تفكّ ترميزها فقط.
ماذا يحتوي حقل local_id؟
local_id عدد صحيح غير موقَّع 32 بت يتوقف معناه على بايت local_domain. للنطاق 0، هو POSIX UID للمستخدم المشغِّل للعملية (مثلاً 1000 للمستخدم الأول غير الجذر على نظام Linux). للنطاق 1، هو POSIX GID. للنطاق 2، المعنى محدَّد من قِبَل التطبيق.
هل الطابع الزمني في UUID v2 موثوق؟
كمؤشر خشن فحسب. لأنه يُحتفَظ فقط بـ 28 بتاً من طابع UUID v1 الزمني البالغ 60 بتاً، تبلغ الدقة الفعلية نحو 7.2 دقائق. يمكنك فكّ ترميز وقت إنشاء تقريبي، لكن ليس وقتاً دقيقاً. داخل نافذة 7 دقائق، ستمتلك قيم UUID v2 المتعددة بنفس local_id والنطاق من المضيف ذاته طوابع زمنية متطابقة.
ما الأنظمة التي لا تزال تستخدم UUID v2؟
يُصادَف UUID v2 أساساً في أنظمة DCE/RPC القديمة من التسعينيات، وبعض إصدارات Microsoft's 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 (المعرّف الفريد العالمي) هو تطبيق Microsoft لمعيار UUID. يستخدم Microsoft COM داخلياً GUIDs من UUID v1 وv4. لا يستخدم UUID v2 من قِبَل بنية تحتية GUID لنظام Windows، رغم اشتراكهما في أصول DCE/RPC ذاتها.