تستخدم كل قاعدة بيانات حديثة ونظام موزع وواجهة برمجية (API) معرّفات فريدة — وفي 2026 تغيّر المعيار الذي يحكمها تغييراً جوهرياً. UUID (المعرّف الفريد الشامل، Universally Unique Identifier) هو وسم من 128 بت يمكنه تحديد المعلومات عبر أنظمة الحاسوب دون أي تنسيق مركزي. في ظل معيار RFC 9562 الجديد (الذي حلّ محل RFC 4122 في مايو 2024)، تغيّر المشهد: يبقى UUID v4 هو الخيار للمعرّفات العشوائية، لكن UUID v7 أصبح الآن المعيار الموصى به للمفاتيح الأساسية في قواعد البيانات، لأن بنيته المرتّبة زمنياً تمنع تجزئة فهارس شجرة B.
يغطّي هذا الدليل الصورة كاملة: كيف تعمل المعرّفات الفريدة، أي إصدار يُستخدم متى، وكيفية تنفيذها بشكل صحيح.
فهم RFC 9562: معيار UUID الحديث
الـ UUID هو رقم من 128 بت يكاد يُضمَن تفرّده — دون الحاجة إلى أي جهة مركزية. وفقاً لـ ويكيبيديا، فإن احتمال تصادم مُعرّفَين فريدين قريب من الصفر لدرجة يُعتبر معها مستحيلاً في التطبيقات الواقعية. يمكن لفرق مختلفة وسم البيانات بشكل مستقل، واثقين من أن مُعرّفاتهم لن تتصادم.
في مايو 2024، نشرت IETF معيار RFC 9562، مُحيلةً معيار RFC 4122 القديم إلى التقاعد. جاء التحديث استجابةً لمتطلبات الأنظمة الموزعة الحديثة، التي احتاجت إلى مُعرّفات فريدة و قابلة للترتيب زمنياً في آن واحد. أُدخِلت ثلاثة إصدارات جديدة: v6 وv7 وv8.
تشريح الـ UUID: الإصدارات والأنماط
ترى عادةً الـ UUID على هيئة 32 محرفاً سداسياً عشرياً مقسّمةً إلى خمس مجموعات بواسطة واصلات (8-4-4-4-12):
550e8400-e29b-41d4-a716-446655440000
^
version
يخبرك حقّان رئيسيّان بكيفية توليد الـ UUID:
| الحقل | الموقع | ما يخبرك به |
|---|---|---|
| بِتات الإصدار | أول 4 بِتات من البايت السابع (أول محرف من المجموعة الثالثة) | الخوارزمية المستخدمة (مثلاً “4” = v4، “7” = v7) |
| بِتات النمط (variant) | البايت التاسع | نمط الـ UUID — يستخدم RFC 9562 نمط بِت 10 |
كما يوضح SnapUtils، فإن بِتات النمط (variant) تفصل معرّفات RFC 9562 الحديثة عن تنسيقات Apollo أو Microsoft القديمة.

لماذا يُعدّ UUID v7 المعيار الذهبي الجديد لقواعد البيانات
أكبر عيب في UUID v4 أنه عشوائي تماماً. عند استخدامه كمفتاح أساسي في فهرس شجرة B، يضطرّ السيرفر إلى إدراج صفوف جديدة في مواقع غير متوقعة. وفقاً لـ CreateUUID، يسبب هذا “انقسامات الصفحات” (page splits) — يجب على قاعدة البيانات إعادة تنظيم البيانات باستمرار لإفساح المجال، مما يؤدي إلى كتابة أبطأ وإهدار الذاكرة.
يحلّ UUID v7 هذه المشكلة بوضع طابع زمني Unix Epoch مكوّن من 48 بِت (بدقة المللي ثانية) في بداية المُعرّف. هذا يجعل المُعرّفات متزايدة رتيباً — الجديد منها دائماً أكبر من القديم. يمكن لقاعدة البيانات ببساطة الإلحاق بنهاية الفهرس، مانحاً إيّاك أداء عدد صحيح تسلسلي مع التفرّد الشامل للـ UUID.

كيف يوازن UUID v7 بين الزمن والإنتروبيا
يملأ UUID v7 الـ 74 بِت المتبقية باستخدام CSPRNG (مولّد أرقام شبه عشوائية آمن تشفيرياً). وفقاً لـ ويكيبيديا، ستحتاج إلى توليد نحو مليار UUID في الثانية لمدة 85 عاماً للوصول إلى احتمال تصادم بنسبة 50%. لأي تطبيق واقعي، يُعدّ UUID v7 محصّناً فعلياً ضد التصادم.
أفضل ممارسات التخزين: Binary(16) مقابل String(36)
كيف تخزّن المعرّفات الفريدة يهمّ بقدر ما يهمّ الإصدار الذي تستخدمه:
| تنسيق التخزين | المساحة | أداء الفهرس | التوصية |
|---|---|---|---|
| Binary(16) | 16 بايت | عالٍ (متراصّ) | أفضل ممارسة |
| نوع UUID أصلي | 16 بايت | عالٍ (مُحسّن) | الأفضل لـ PostgreSQL |
| سلسلة نصية (Char 36) | 36–72 بايت | منخفض (مُجزّأ) | تجنّب |
يوصي SnapUtils دائماً باستخدام الأنواع الأصلية بدلاً من السلاسل النصية. في PostgreSQL، يخزّن النوع الأصلي uuid البيانات بتنسيق ثنائي متراصّ من 16 بايت مع دعم الاستعلامات القياسية القائمة على السلاسل النصية.
UUID مقابل GUID: هل هناك فرق؟
الـ GUID (المعرّف الفريد الشامل، Globally Unique Identifier) هو تنفيذ مايكروسوفت لمعيار UUID. تاريخياً كان هناك فرق في ترتيب البايتات (endianness) — استخدمت مُعرّفات GUID المبكرة من مايكروسوفت ترتيب little-endian للحقول الثلاثة الأولى، بينما استخدمت المعرّفات الفريدة القياسية ترتيب big-endian (ترتيب بايتات الشبكة) (SnapUtils).
بحلول 2026، أصبح هذا مجرد اصطلاح تسمية في الغالب. في ظل RFC 9562، يعملان بشكل متطابق. دالة Guid.NewGuid() في .NET متوافقة تماماً مع uuid.uuid4() في بايثون. ستسمع “GUID” في أوساط Windows/Azure و”UUID” في مجتمعات لينكس والمصدر المفتوح.
تنفيذ المعرّفات الفريدة الحديثة: لغة بلغة
| اللغة | UUID v4 | UUID v7 |
|---|---|---|
| Python | وحدة uuid المدمجة |
حزمة uuid6 أو uuid7 |
| JavaScript | crypto.randomUUID() |
حزمة npm uuid (v10+) |
| PostgreSQL | gen_random_uuid() (PG 13+) |
uuidv7() الأصلية (PG 17+) أو الإضافات |
| .NET | Guid.NewGuid() |
حزم المجتمع |
| Rust | crate باسم uuid (v1.7+) |
crate باسم uuid مع ميزة v7 |
المعرّفات الحتمية: UUID v5
إذا احتجت إلى نفس المُعرّف في كل مرة لمدخل مُعطى (مثل رابط URL أو اسم مستخدم)، استخدم UUID v5. فهو يطبّق تجزئة SHA-1 على مُعرّف UUID لمساحة الأسماء وسلسلة اسم — مثالي لإزالة التكرار عندما يتعذّر الاستعلام عن قاعدة بيانات مركزية.
درس الخصوصية من UUID v1
يستخدم UUID v1 طابعاً زمنياً وعنوان MAC الخاص بالحاسوب. هُجِر إلى حد كبير لأنه يُسرّب معلومات الأجهزة. مثال شهير: قُبِض على صانع فيروس ميليسا لأن المعرّفات الفريدة في مستندات وورد المصابة احتوت على عنوان MAC الخاص به تحديداً.
RFC 9562 المتقدم: v6 وv8 والمعرّفات الخاصة
أضاف RFC 9562 إصدارات متخصصة لاحتياجات الأنظمة الموزعة المتخصصة:
| الإصدار | الغرض | متى يُستخدم |
|---|---|---|
| v6 | طابع زمني مُعاد ترتيبه من v1 — قابل للترتيب مع الحفاظ على دقة v1 | ترحيل أنظمة v1 القديمة |
| v8 | مخصّص — 122 بِت لبيانات يحددها المطوّر | مخططات تجريبية أو خاصة بمورّد |
| Nil UUID | 00000000-0000-0000-0000-000000000000 |
عنصر نائب فارغ |
| Max UUID | FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF |
علامة نهاية النطاق |
خاتمة
لقد حدّث RFC 9562 المعرّفات الفريدة لعصر السحابة الحديث. الإرشادات العملية:
- المفاتيح الأساسية لقواعد البيانات → استخدم UUID v7 لإدراج مرتّب زمنياً وغير مُجزّأ
- العشوائية العامة → UUID v4 لا يزال جيداً تماماً
- إزالة التكرار → UUID v5 يمنحك مُعرّفات حتمية
- التخزين → استخدم دائماً Binary(16) أو أنواع UUID الأصلية، لا السلاسل النصية أبداً
إجراء: راجع مخططات قاعدة بياناتك. إذا كنت تستخدم UUID v4 كمفتاح أساسي في جداول بملايين الصفوف، فإن الترحيل إلى UUID v7 تغيير بسيط يمكن أن يقلّل تجزئة الفهرس بشكل كبير ويُسرّع الاستعلامات.
الأسئلة الشائعة
هل الـ UUID هو نفسه الـ GUID؟
وظيفياً، نعم. الـ GUID هو تنفيذ مايكروسوفت لمعيار UUID. في ظل RFC 9562، هما متطابقان في السلوك — يمكنك استخدامهما بالتبادل عبر تطبيقات .NET وJava وPython.
هل يمكن أن يتصادم مُعرّفان فريدان في سيناريو واقعي؟
رياضياً ممكن، وعملياً مستحيل. بالنسبة لـ UUID v4، ستحتاج إلى توليد نحو 2.71 كوينتليون مُعرّف للوصول إلى احتمال تصادم 50%. وفقاً لـ Generate-Random.org، فإن توليد مليار UUID في الثانية لمدة 85 عاماً يمنحك فرصة 50% فقط لحدوث تصادم واحد.
هل يجب تخزين المعرّفات الفريدة كنصوص أم كبيانات ثنائية في قاعدة البيانات؟
امنح دائماً الأولوية لـ Binary(16) أو نوع UUID الأصلي (متاح في PostgreSQL). تستهلك السلسلة النصية ذات 36 محرفاً أكثر من ضعف المساحة وتبطّئ عمليات بحث الفهرس والوصل (joins) بشكل كبير. يشير SnapUtils إلى أن فوائد أداء RFC 9562 تتعاظم عندما يبقى التخزين متراصّاً.
متى يجب أن أستخدم UUID v5 بدلاً من UUID v4؟
استخدم v5 عندما تحتاج إلى مُعرّفات حتمية — نفس المدخل ينتج دائماً نفس UUID دون الاستعلام عن قاعدة بيانات. استخدم v4 عندما تحتاج إلى عشوائية تامة وتريد ضمان ألا يُمكن الهندسة العكسية للمُعرّف للوصول إلى مصدره.

اترك تعليقاً