ما هو UUID؟
إنّ UUID (المعرّف الفريد عالمياً) هو قيمة من 128 بت تُعرض كسلسلة من 36 محرفاً مثل 550e8400-e29b-41d4-a716-446655440000. تُعرَّف صيغته ودلالات إصداراته في RFC 4122 للإصدارات من v1 إلى v5، وفي RFC 9562 للإصدارات الأحدث v6 و v7 و v8. تُولّد هذه الأداة v4 (عشوائي بالكامل) و v1 (طابع زمني مع معرّف عقدة عشوائي) و v7 (بادئة طابع زمني Unix بالميلي ثانية مع لاحقة عشوائية، قابلة للترتيب حسب زمن التوليد) — كل ذلك داخل متصفحك، عبر واجهة Web Crypto الخاصة بالمنصة. لا تُرسَل أي بيانات إلى أي خادم.
كيف يعمل توليد UUID؟
يوازن كل إصدار بين الحتمية والقابلية للترتيب والإنتروبيا بطرق مختلفة. تختار الأداة الخوارزمية المناسبة حسب اختيارك:
- v4 (العشوائي) يستدعي
crypto.randomUUID()من المتصفح، ويعيد 122 بت من العشوائية التشفيرية، مع ضبط الـ 6 بتات الثابتة (الإصدار0100والمتغيّر10) في مواضعها الصحيحة. الاصطدامات بعيدة الاحتمال إلى حدّ فلكي — يلزم توليد نحو 2.71 كوينتليون من UUID v4 لاحتمال 50% بحدوث تكرار واحد. - v1 (طابع زمني + عقدة) يحزم طابعاً زمنياً غريغورياً من 60 بت (نقرات قدرها 100 نانوثانية منذ 15-10-1582) في
time_lowوtime_midوtime_hi_and_version، ويضبط نِبل الإصدار على0001، ويختار تسلسل ساعة من 14 بت مع بتات المتغيّر، ويستخدم معرّف عقدة عشوائياً من 48 بت مع تثبيت بت البثّ المتعدّد على 1 (يسمح RFC 4122 §4.5 صراحة باستخدام معرّف عقدة عشوائي عند غياب عنوان MAC مادي، وبت البثّ المتعدّد يميّزه على أنه ليس MAC). - v7 (طابع زمني قابل للترتيب)، وفقاً لـ RFC 9562 §5.7، يضع طابعاً زمنياً Unix بالميلي ثانية مكوّناً من 48 بت بترتيب big-endian، يليه الإصدار من 4 بتات
0111، ثم 12 بت عشوائي، ثم المتغيّر من بتين10، ثم 62 بتاً عشوائياً إضافياً. وبما أن الطابع الزمني يقع في أعلى البتات وزناً، فإن معرّفات v7 تُرتَّب معجمياً وفق ترتيب التوليد — وهي خاصية لا تقدّمها أي نسخة UUID أخرى دون ترميز إضافي. - تأتي كل العشوائية من
crypto.getRandomValues()، وهو مولّد الأرقام العشوائية الآمن تشفيرياً في المتصفح. يتضمّن كل من v1 و v7 حارساً للرتابة داخل النقرة الواحدة بحيث يبقى استدعاءان متتاليان داخل نفس نقرة الساعة مرتّبين بحيث يقع الثاني فوق الأول — وهذا مهم لجلسات التوليد بالجملة التي تسبق ساعة الميلي ثانية. - يجري خطّ أنابيب التنسيق بعد التوليد. يمكنك إزالة الواصلات، أو التحويل إلى الأحرف الكبيرة، أو إحاطة القيمة بأقواس معقوفة (
{…}— وفق اصطلاح GUID لدى Microsoft)، أو عرض الـ 16 بايت الخام بترميز base64 (مخرج من 22 محرفاً دون padding). يُلغي وضع base64 خيارات التنسيق الأخرى لأنه تمثيل قائم بذاته.
لماذا نستخدم مولِّد UUID هذا؟
- لا شيء يغادر متصفّحك. تعمل واجهة Web Crypto محلياً، ولا تُجري الصفحة أي طلب شبكة بعد تحميل المستند الأوّلي. افتح أدوات المطوّر، اضغط على «توليد»، وسيظل لوحة الشبكة صامتة.
- مخرَجات مطابقة لـ RFC. يتبع v4 RFC 4122 §4.4، ويتبع v1 §4.2 و §4.5، ويتبع v7 RFC 9562 §5.7. تُوضَع نِبل الإصدار وبتات المتغيّر حيث تقول المعايير — يجتاز كل UUID التعبير النمطي القانوني لإصداره.
- v7 قابل للترتيب لمفاتيح قواعد البيانات. عند استخدام v7 كمفتاح أساسي مُجمَّع في Postgres أو MySQL أو SQL Server، تبقى عمليات الإدراج إلحاقية على الفهرس — بلا انقسام صفحات، وبلا I/O عشوائي — مع الحفاظ على التفرّد العالمي. لا يستطيع v4 ذلك لأنّ بتاته عشوائية.
- توليد بالجملة دون حدود معدّل. ولّد 1 أو 10 أو 100 أو 1000 معرّف UUID دفعة واحدة. لا حصص، ولا تسجيل — تعمل الأداة في علامة تبويبك، فالسقف هو معالجك لا فئة API لأي مزوّد.
ما هي التطبيقات الشائعة لـ UUID؟
تظهر معرّفات UUID حيثما يحتاج النظام إلى معرّف فريد عالميًا دون التنسيق مع جهة مركزية:
- المفاتيح الأساسية لقواعد البيانات. الأرقام الصحيحة ذات الزيادة التلقائية تكشف عدد الصفوف وتُفسد التشظية (sharding). معرّفات UUID مستقرّة عبر الشظايا، آمنة للدمج بين المناطق، و(مع v7) تُبقي إدراجات الـ B-tree في المنطقة الساخنة دون انقسام صفحات. تُنتج التطبيقات النموذجية المعرّف من جهة العميل، وترسله مع تعليمة الإدراج، فلا تحتاج أبداً لرحلة ذهاب وعودة إلى الخادم للحصول على المفتاح.
- معرّفات ربط الطلبات. تُلصق برمجيات HTTP الوسيطة معرّف UUID v4 بكل طلب وارد، وتسجّله في كل span، وتنقله إلى الخدمات اللاحقة (غالباً عبر ترويسة
X-Request-Id). حين يُبلّغ عميل عن خطأ، يلصق مهندس الدعم المعرّف فيظهر تتبّع الطلب كاملاً — عبر الخدمات والمناطق الزمنية — بلا غموض. - مفاتيح المثالية (Idempotency). تقبل واجهات الدفع (Stripe و Adyen و Square) ترويسة
Idempotency-Keyحتى لا يُحاسَب العميل مرّتين عند إعادة المحاولة. يضمن UUID المولَّد من العميل أن يكون المفتاح فريداً لكل عملية منطقية، وهو بالضبط ما تتطلّبه عقود تلك الواجهات.
كيف يبدو مثال على UUID؟
في Node.js أو أيّ متصفّح حديث، يعيد السطر الواحد crypto.randomUUID() معرّف UUID v4 جديداً — مثلاً 3f50b5a8-2c54-4b9c-9c1f-3e5c7e2b8d12. استعمله كمعرّف طلب أو مفتاح مثالية. حين يدخل المعرّف عموداً سيكون مفتاحاً أساسياً مُجمَّعاً في قاعدة البيانات، ولّد v7 بدلاً من ذلك: قيمتان من v7 تُنتَجان بفاصل ميلي ثانية، مثل 0190a3b0-7d4f-7c9e-8b21-a4d6f0bd9c11 و 0190a3b0-7d50-7f15-9c4e-72b3e0c1d8a4، تُرتَّبان معجمياً وفق ترتيب التوليد. يُخزّن نوع uuid في Postgres كلا الإصدارين بنفس الطريقة، لكنّ الفارق يظهر عند كتابة الفهرس: تُلحَق إدراجات v7 على يمين الـ B-tree، بينما تتشتّت إدراجات v4 وتفرض I/O عشوائياً.
يقوم مولّد UUID هذا بمهمّة واحدة: تحويل نقرة إلى معرّف واحد أو عدّة معرّفات مطابقة لـ RFC، بالتنسيق الذي تحتاجه، دون إرسال طلبك إلى أي خادم. اختر إصداراً، اختر عدداً، اختر تنسيقاً — ولِّد، انسخ، تابع عملك.