- النوع
- الإصدار 7: تاريخ Unix قابل للترتيب
- المتغيّر
- RFC 9562 (سابقًا RFC 4122)
- تاريخ الإنشاء
- 22/02/2022، 4:22:22 م 2022-02-22T19:22:22.000Z · 1645557742000 ms
017f22e2-79b0-7cc3-98c4-dc0c0c07398f017F22E2-79B0-7CC3-98C4-DC0C0C07398F{017F22E2-79B0-7CC3-98C4-DC0C0C07398F}urn:uuid:017f22e2-79b0-7cc3-98c4-dc0c0c07398f01FWHE4YDGFK1SHH6W1G60EECF017f22e279b07cc398c4dc0c0c07398f1989357241971137676463954034883508623AX8i4nmwfMOYxNwMDAc5jw==كيف يعمل
معرّف UUID هو رقم بطول 128 بت يُكتب كـ 32 رقمًا ست عشريًا في خمس مجموعات (8-4-4-4-12). يُستخدم لتعريف سجل دون سؤال أي جهة عمّا إذا كانت القيمة مستخدمة: يمكن لخادمين أو تطبيقين للهاتف أو عمليتين إنشاء معرّفات في الوقت نفسه دون تنسيق ودون تصادم. يحدّد التنسيقَ معيارُ RFC 9562 الذي حلّ محل RFC 4122 في 2024 وأضاف الإصدارات 6 و7 و8.
الرقم الذي يبدأ المجموعة الثالثة يشير إلى الإصدار، وكل إصدار يرتّب البتات بطريقة مختلفة. الإصدار 4 عشوائي تمامًا. الإصدار 7 يبدأ بالتاريخ بالمللي ثانية، لذا تُرتَّب المعرّفات حسب وقت إنشائها. الإصداران 3 و5 لا يحتويان على أي عشوائية: يُشتقّان من تجزئة فضاء أسماء واسم، ولذلك يعطيان النتيجة نفسها دائمًا. أما الإصداران 1 و6 فيحملان تاريخًا بدقة 100 نانوثانية وعُقدة كانت تاريخيًا عنوان MAC للحاسوب.
يسلك المحلّل الطريق المعاكس: يقرأ الإصدار والمتغيّر، ويستخرج تاريخ معرّفات UUID من الإصدارات 1 و6 و7 ومعرّفات ULID، ويعرض القيمة نفسها بصيغة GUID أو URN أو ست عشرية أو عدد صحيح أو Base64. يُحسب كل شيء في متصفحك؛ ولا يُرسل أي معرّف إلى خادم.
أمثلة
v5 · DNS · www.example.com2ed6657d-e927-568b-95e1-2665a8aea6a2هذا متجه الاختبار في RFC 9562. يجب أن تُرجع أي مكتبة تطبّق الإصدار 5 بشكل صحيح هذه القيمة بالضبط لهذا الاسم في فضاء DNS.017F22E2-79B0-7CC3-98C4-DC0C0C07398F2022-02-22T19:22:22.000Zأول 12 رقمًا في UUID v7 هي ميلي ثواني Unix بالنظام الست عشري: 0x017F22E279B0 يساوي 1645557742000.C232AB00-9414-11EC-B3C8-9F6BDECED8461EC9414C-232A-6B00-B3C8-9F6BDECED846اللحظة نفسها كإصدار 1 وكإصدار 6. يعيد الإصدار 6 ترتيب بتات التاريخ من الأعلى أهمية إلى الأدنى ليُرتَّب النص زمنيًا؛ ولا يتغيّر تسلسل الساعة ولا العُقدة.01ARZ3NDEKTSV4RRFFQ69G5FAV01563e3a-b5d3-d676-4c61-efb99302bd5bيشغل ULID نفس الـ 128 بت التي يشغلها UUID، لذا يمكن تخزينه في عمود uuid. لكنه بلا إصدار ولا متغيّر: عند قراءته كـ UUID تكون تلك الأرقام جزءًا من القيمة العشوائية.حالات الاستخدام
- إنشاء المفتاح الأساسي على جهة العميل أو في عدة خدمات معًا دون انتظار قاعدة البيانات لتعيين قيمة تزايدية تلقائية.
- إنشاء مفاتيح عدم التكرار (idempotency) حتى لا تُعالَج عملية دفع أو طلب أُعيدت محاولته مرتين.
- وسم كل طلب بمعرّف ارتباط لتتبّعه عبر سجلات عدة خدمات مصغّرة.
- اشتقاق معرّف ثابت باستخدام v5 من مفتاح طبيعي (بريد إلكتروني أو URL أو SKU) حتى يصل نظامان إلى القيمة نفسها دون مشاركة جدول.
- معرفة وقت إنشاء سجل من UUID v7 أو ULID الخاص به عندما يظهر في سجل أحداث أو تقرير خطأ.
- تحميل بيانات اختبار بمئات المعرّفات الصالحة دفعة واحدة.
الأسئلة الشائعة
v4 أم v7 للمفتاح الأساسي؟
v7، إلا إذا كان لديك سبب لإخفاء تاريخ الإنشاء. تخزّن فهارس B-tree المفاتيح بترتيب، ويقع v4 في أي مكان من الفهرس: كل إدراج يمسّ صفحة مختلفة، فتنقسم الصفحات ويقلّ أداء الذاكرة المؤقتة. أما v7 فيذهب دائمًا إلى النهاية مثل القيمة التزايدية. انتبه في SQL Server: نوع uniqueidentifier يرتّب بدءًا من آخر ستة بايتات، لذا لن يكون v7 متسلسلًا هناك أيضًا.
هل يمكن أن يتكرر معرّفا UUID v4؟
نظريًا نعم، وعمليًا لا. يحتوي v4 على 122 بتًا عشوائيًا، وللوصول إلى احتمال 50 % لوجود تكرار واحد على الأقل يجب إنشاء نحو 2.7 × 10¹⁸ معرّف، أي مليار في الثانية لأكثر من 85 عامًا. الشرط هو استخدام مولّد تشفيري: التكرارات الحقيقية المُبلَّغ عنها تأتي من بذور سيئة التهيئة، لا من الرياضيات.
هل UUID وGUID الشيء نفسه؟
نعم، GUID هو الاسم الذي تستخدمه Microsoft والنص متطابق؛ وفي Windows يظهر عادةً بأحرف كبيرة وبين أقواس معقوفة. الفرق في الشكل الثنائي: تخزّن الدالة Guid.ToByteArray في .NET المجموعات الثلاث الأولى بترتيب little-endian، لذا إن قرأت تلك البايتات الخام من لغة أخرى سترى الأرقام الأولى معكوسة.
هل يمكنني استخدام UUID كرمز سري؟
يحتوي v4 المُنشأ جيدًا على 122 بتًا غير قابلة للتنبؤ، وهذا يكفي لرابط يصعب تخمينه، لكن RFC 9562 يوضّح أن معرّفات UUID ليست مصمَّمة لتكون بيانات اعتماد: كثير من المكتبات لا تضمن مولّدًا تشفيريًا، والإصدارات 1 و6 و7 تكشف تاريخ الإنشاء. لرموز الجلسات أو استعادة كلمة المرور يُفضَّل إنشاء بايتات عشوائية مخصّصة.
ULID أم UUID v7؟
يحملان تقريبًا المعلومات نفسها: 48 بتًا للمللي ثانية والباقي عشوائي. يُكتب ULID في 26 حرفًا بلا شرطات ولا أحرف ملتبسة، وهو أنسب في عناوين URL. أما v7 فهو UUID قياسي، لذا يتوافق مع أعمدة uuid في PostgreSQL ومع أي أداة تحقّق دون تحويل. إذا كنت تبدأ من الصفر وقاعدة بياناتك تدعم نوع uuid، فاختر v7.
لماذا ليست عُقدة معرّفات UUID v1 الخاصة بي هي عنوان MAC؟
لأن كشف عنوان MAC لبطاقة الشبكة يتيح تتبّع الجهاز الذي أنشأ كل معرّف، وبهذه الطريقة جرى التعرّف على مؤلف فيروس Melissa عام 1999. يوصي RFC 9562 باستخدام عُقدة عشوائية مع تفعيل بت الإرسال المتعدد، وهذا ما تفعله هذه الأداة؛ ويُنبّهك المحلّل عندما يحتوي UUID v1 على عنوان MAC حقيقي.