لماذا المعرّفات الفريدة أكثر تعقيداً مما تبدو
تحتاج إلى معرّف فريد لصف في قاعدة البيانات، أو مورد API، أو رمز جلسة. بسيط، أليس كذلك؟ استخدم رقماً فحسب.
مشكلة الأعداد الصحيحة المتسلسلة: يمكن التنبؤ بها (/users/1، /users/2) — يستطيع أي شخص تعداد مواردك. تتطلب سلطة مركزية (خادم واحد فقط يقرر الرقم "التالي"). وتكشف معلومات تجارية (طلبك الألف له المعرّف 1000).
لذا اخترع العالم معرّفات أفضل. ولم يتوقف عن الاختراع. إليك ما يفعله كل منها فعلياً.
UUID (v4) — الخيار الآمن الافتراضي
التنسيق: 550e8400-e29b-41d4-a716-446655440000
الطول: 36 حرفاً (32 هكساديسيمال + 4 شرطات)
العشوائية: 122 بت
UUID v4 هو 122 بتاً عشوائياً بتنسيق قياسي. احتمالية التصادم منخفضة بشكل فلكي (ستحتاج إلى توليد مليار UUID في الثانية لمدة 85 عاماً للحصول على احتمال 50% للتصادم) لدرجة أنها مستحيلة فعلياً.
ما يتميز به UUID:
- معيار عالمي — كل لغة وقاعدة بيانات وإطار عمل يدعمه أصلاً
- لا حاجة للتنسيق — أي خادم أو عميل يمكنه التوليد باستقلالية
- غير متسلسل — لا هجمات تعداد
عيوب UUID:
- غير قابل للفرز — UUIDs عشوائية ولا تُرتَّب حسب وقت الإنشاء. في فهرس B-tree (كيفية عمل معظم قواعد البيانات)، الإدراجات العشوائية تسبب "انقسامات الصفحات" — قاعدة البيانات تعيد تنظيم فهرسها باستمرار. على نطاق واسع، هذا مكلف.
- كبير: 36 حرفاً كنص، 16 بايت ثنائياً
- غير مناسب للـ URL (يحتوي على شرطات)
استخدم UUID v4 عندما: تحتاج إلى معرّف قياسي مدعوم على نطاق واسع دون القلق بشأن ترتيب الفرز.
UUID v7 — UUID المُصحَّح
التنسيق: 018e2c4c-3d12-7f3a-91f8-3e4a5b6c7d8e
الطول: 36 حرفاً
العشوائية: 74 بت (مع بادئة طابع زمني 48 بت بالميلي ثانية)
UUID v7 (المعتمد في 2023) هو UUID مع بادئة طابع زمني. أول 48 بت هي طابع زمني Unix بالميلي ثانية، مما يجعل UUIDs قابلة للفرز حسب وقت الإنشاء.
لماذا يهم: معرّفات قابلة للفرز = إدراجات متسلسلة في B-tree = أداء فهرس قاعدة بيانات أفضل بكثير على نطاق واسع.
استخدم UUID v7 عندما: تريد توافق UUID لكنك تحتاج إلى معرّفات مرتبة زمنياً لأداء قاعدة البيانات.
ULID — بديل UUID قابل للفرز وآمن للـ URL
التنسيق: 01ARZ3NDEKTSV4RRFFQ69G5FAV
الطول: 26 حرفاً
العشوائية: 80 بت (مع بادئة طابع زمني 48 بت بالميلي ثانية)
ULID (معرّف فريد عالمياً قابل للفرز معجمياً) يحل مشكلة فرز UUID بتنسيق أنظف. يُشفِّر 48 بت طابع زمني + 80 بت عشوائية في Crockford Base32 (بدون شرطات، بدون أحرف غامضة).
ما يتميز به ULID:
- قابل للفرز معجمياً (يُرتَّب بشكل صحيح كنص)
- آمن للـ URL (بدون شرطات أو أحرف خاصة)
- 26 حرفاً مقابل 36 في UUID — أكثر إيجازاً
- طابع زمني بدقة الميلي ثانية مدمج
عيوب ULID:
- أقل شيوعاً من UUID — يتطلب مكتبة في معظم اللغات
- الرتابة: ULIDs متعددة مُولَّدة في نفس الميلي ثانية قد لا تُرتَّب بشكل صحيح بدون المتغير الرتيب
استخدم ULID عندما: تريد معرّفات قابلة للفرز وأيضاً مدمجة وآمنة للـ URL، دون الحاجة إلى توافق UUID.
CUID2 — آمن للـ URL، مقاوم للتصادم، بدون طابع زمني
التنسيق: clyg4v5l20000356ok1f5t6nb
الطول: 24 حرفاً (افتراضي)
العشوائية: عالية (بصمة SHA-3، لا بنية يمكن التنبؤ بها)
CUID2 مصمم للسياقات الحساسة للأمان. على عكس ULID، ليس له بادئة طابع زمني عمداً — لا يمكن استنتاج وقت إنشاء مورد من معرّفه.
ما يتميز به CUID2:
- أكثر أماناً من UUID/ULID للمعرّفات العامة (لا معلومات توقيت)
- آمن للـ URL
- طول قابل للتكوين (موازنة بين الطول ومقاومة التصادم)
عيوب CUID2:
- غير قابل للفرز (بالتصميم)
- دعم أقل انتشاراً من UUID
- يعتمد على مكتبة محددة
استخدم CUID2 عندما: المعرّفات عامة ولا تريد الكشف عن طوابع الإنشاء الزمنية (معرّفات المستخدمين، مفاتيح API، الروابط المختصرة).
NanoID — صغير، سريع، قابل للتخصيص
التنسيق: V1StGXR8_Z5jdHi6B-myT
الطول: 21 حرفاً (افتراضي، قابل للتكوين)
الأبجدية: قابلة للتخصيص (افتراضي: Base64 آمن للـ URL)
NanoID هو بديل حديث وخفيف لـ UUID. نفس احتمالية تصادم UUID v4 في 21 حرفاً، لكن أصغر وبأبجدية قابلة للتخصيص.
ما يتميز به NanoID:
- الأكثر إيجازاً (21 حرفاً مقابل 36 في UUID)
- أبجدية قابلة للتخصيص — يمكن توليد معرّفات بأحرف صغيرة فقط، أو أرقام فقط، إلخ.
- متاح في 20+ لغة
- سريع
عيوب NanoID:
- غير قابل للفرز
- ليس معياراً (لا RFC)
استخدم NanoID عندما: الحجم مهم (URLs، رموز قصيرة) أو تحتاج إلى أبجدية مخصصة.
جدول القرار
| UUID v4 | UUID v7 | ULID | CUID2 | NanoID | |
|---|---|---|---|---|---|
| قابل للفرز | ✗ | ✓ | ✓ | ✗ | ✗ |
| آمن للـ URL | ✗ | ✗ | ✓ | ✓ | ✓ |
| معيار (RFC) | ✓ | ✓ | ✗ | ✗ | ✗ |
| أداء قاعدة البيانات | ضعيف | جيد | جيد | ضعيف | ضعيف |
| يخفي الطابع الزمني | ✓ | ✗ | ✗ | ✓ | ✓ |
| الحجم (حرف) | 36 | 36 | 26 | 24 | 21 |
الإجابة البسيطة
- الاختيار الافتراضي: UUID v7 — قابل للفرز، معياري، أداء قاعدة بيانات ممتاز
- تحتاج آمن للـ URL + قابل للفرز: ULID
- معرّفات عامة (لا تكشف التوقيت): CUID2
- رموز قصيرة، أبجدية مخصصة: NanoID
- نظام قديم / أقصى توافق: UUID v4
ولّد معرّفات الآن
مولّد UUID يولّد UUID v4 و v7 — توليد جماعي، نسخ بنقرة واحدة. لا حاجة لحساب.