UUID مقابل ULID مقابل CUID أي معرف فريد يجب أن تستخدمه؟

نُشرت في
مُقارنة UUID مقابل ULID مقابل CUID: أي معرف فريد يجب أن تستخدمه؟ 1
إعلان · حذف؟

كل صف في قاعدة البيانات، وكل مورد في واجهة برمجة تطبيقات، وكل حدث موزع يحتاج إلى معرف. المشكلة ليست إنشاء هذا المعرف، بل اختيار التنسيق الذي لا يسبب مشكلة بعد ستة أشهر عندما تصبح مؤشرات بَغَرَة قاعدة البيانات مُتَمَسَّكة وتصبح الروابط مُحَوَّلة إلى ضوضاء.

إليك المقارنة الكاملة مُقارنة مُولدات UUID: UUID v4، UUID v7، ULID، CUID2، وSnowflake — ما هي، أين تنهار، وما هو الذي يجب أن تستخدمه فعليًا.

UUID v4: القيمة الآمنة الافتراضية (مع مشكلة كبيرة)

UUID v4 يحتوي على 128 بت من العشوائية، ويُشكل على النحو التالي: 550e8400-e29b-41d4-a716-446655440000. وهو مُفهوم عالميًا، مدعوم في كل لغة، كل قاعدة بيانات، وكل مُنظمة مُوجهة على الأرض.

فرص التصادم تُعتبر صفرية — لكي تصل إلى احتمال 50% لتصادم واحد، يجب أن تُولِّد 1 مليار UUID في الثانية لمدة 85 سنة. وهذا ليس مُقلقًا عمليًا.

المشكلة هي الترتيب. UUID v4 هو كامل العشوائية، مما يعني أن إدخال الصفوف في جدول مُقَسَّم على UUID يُوزع الكتابات عبر شجرة B. عند التوسع، يسبب هذا تجزئة الصفوف، تراكم المؤشرات، وانخفاض أداء الإدخال. إذا كنت تُدخل آلاف الصفوف في الثانية إلى جدول MySQL أو Postgres مع مفتاح أساسي من نوع UUID، فستشعر بهذا.

كما أن UUID v4 يحتوي على 36 حرفًا كنص — ليس آمنًا للروابط بدون تشفير، ويتضمن حجمًا كبيرًا مقارنة بالبدائل.

UUID v7: الابن الأفضل لـ UUID v4

يُعالج UUID v7 مشكلة الترتيب. إنه UUID مُرتّب بزمن، حيث تُستخدم الأجزاء الأهم لتمثيل توقيت مللي ثانية، والباقي عشوائي. النتيجة: 01875f3a-7b2d-7f8e-a3d1-4b2e6c1a0f93.

الصفوف المُدخلة بترتيب زمني تبقى تقريبًا متسلسلة في المؤشر. هذا فائدة كبيرة في الأحمال المُتزايدة. UUID v7 متوافق مع جميع البنية المُتاحة للـ UUID — نفس التنسيق، نفس طول الحقل، نفس توقعات الدعم في المكتبات — مع إضافة القدرة على الترتيب.

تم تأكيد المعيار في عام 2022، ودعم المكتبات يُصبح سريعًا. إذا كنت تستخدم UUID بالفعل ولا يمكنك تغيير البنية، فإن التحول من v4 إلى v7 هو منخفض المخاطر ومرتفع العوائد.

ULID: الخيار الأكثر ملاءمة للمطورين

ULID (مُعرف مُوحد مُرتّب أبجديًا) يُخزن توقيتًا بطول 48 بت وعشوائية بطول 80 بت في 26 حرفًا من النظام الثلاثي الثلاثي: 01ARZ3NDEKTSV4RRFFQ69G5FAV.

ما يميزه:

  • قابل للترتيب بشكل افتراضي — الترتيب الأبجدي هو الترتيب الزمني
  • مُتاح للروابط — لا يحتوي على أشرطة، لا يحتوي على أحرف خاصة
  • غير حساس لحالة الأحرف — يتجنب 0/O و 1/I الغموض من خلال استبعاد هذه الأحرف من الأبجدية
  • صغير — 26 حرفًا مقابل 36 للنص المُكوّن من UUID

ULID هو الخيار الأكثر ملاءمة لمشاريع جديدة لا تملك قيودًا وراثية. فهو كافٍ للترتيب في معظم الاستخدامات، قصير بما يكفي للروابط، وسهل القراءة بحيث يمكن للكائن أن ينسخه دون أخطاء في التحويل.

ملاحظة واحدة: إذا أنشأت عدة ULIDs في نفس اللحظة، فإن الترتيب المُتسلسل يُضمن داخل كل عملية ولكن ليس بين عقد موزعة. في معظم التطبيقات، هذا لا يشكل مشكلة.

CUID2: مُصمم خصيصًا للأنظمة الموزعة

CUID2 هو الابن الجديد لـ CUID، تم تصميمه من الصفر لضمان الأمان والمقاومة للتصادم في البيئات الموزعة. يُظهر CUID2 على النحو التالي: clh3uj5ln0000qzrmn831mbhe.

يستخدم تشفير SHA-3 لتركيب توقيت، عداد، بصمة (معرّف العملية + اسم الجهاز)، وبيانات عشوائية. البصمة هي الفرق الرئيسي — تم تصميمها خصيصًا لمنع التصادم عندما تُولّد العديد من مولدات المعرفات في نفس الوقت عبر العديد من الخوادم.

CUID2 هو غير قابل للترتيب. يُعطي الأولوية للدفاع عن التصادم والعدم التنبؤي على الترتيب الزمني. إذا كنت تبني نظامًا يُولّد معرفات من قبل مُستخدمين غير موثوقين أو عبر عدد كبير من العقد المستقلة، وتحتاج إلى أمان، فإن CUID2 يستحق التنازل.

للمستويات الخلفية للواجهات، فهو مفرط.

مُعرفات سنافلوك: سرعة عالية، لكنك تُصبح مسؤولًا عن ذلك

تم ابتكار مُعرفات سنافلوك في تويتر لتقديم معرفات فريدة بسرعة ملايين في الثانية عبر مجموعة موزعة. يُشكل مُعرف سنافلوك عددًا بطول 64 بت: توقيت (41 بت) + معرف مركز البيانات (5 بت) + معرف الجهاز (5 بت) + تسلسل (12 بت).

هي قابلة للترتيب، مكثفة (تتناسب مع BIGINT)، وسريعة جدًا. يستخدمها ديسكورد، إنستغرام، وعديد من الأنظمة ذات المدى العالي.

النقطة: تحتاج إلى إدارة معرفات الأجهزة. هذا يعني خدمة تنسيق (ZooKeeper، etcd، جدول قاعدة بيانات) لتخصيص معرفات أجهزة مُميزة لكل مولد معرف. إذا تشارك جهازان نفس معرف الجهاز، فإن التصادم يحدث. إعداد ذلك بشكل صحيح ليس سهلًا، والحفاظ عليه يُعد تكلفة تشغيلية.

إلا إذا كنت تُولّد ملايين المعرفات في الثانية، فإن التعقيد ليس يستحق.

المقارنة

UUID versión 4 UUID v7 معرف الوحدة الموحدة CUID2 Snowflake
قابل للترتيب لا نعم نعم لا نعم
مُتاح للروابط لا (بأشرطة) لا (بأشرطة) نعم نعم نعم (بشكل عدد)
مقاومة الاصطدام مُمتاز مُمتاز عالي مُمتاز عالي (مع تنسيق)
تعقيد لا أحد لا أحد لا أحد قليل عالي
الاستخدام المعتاد الأنظمة الوراثية، الاستخدام العام مفاتيح قواعد البيانات واجهات برمجة، روابط، مشاريع جديدة مُستخدمون من قبل مُستخدمين غير موثوقين، أنظمة موزعة أنظمة ذات سرعة عالية (أكثر من 100 ألف معرف في الثانية)

إنشاء كل معرف في Node.js

// UUID v4
import { v4 as uuidv4 } from 'uuid';
console.log(uuidv4()); // '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

// UUID v7
import { v7 as uuidv7 } from 'uuid';
console.log(uuidv7()); // '01875f3a-7b2d-7000-8000-4b2e6c1a0f93'

// ULID
import { ulid } from 'ulid';
console.log(ulid()); // '01ARZ3NDEKTSV4RRFFQ69G5FAV'

// CUID2
import { createId } from '@paralleldrive/cuid2';
console.log(createId()); // 'clh3uj5ln0000qzrmn831mbhe'

// Snowflake (using @socialgouv/nextid for simplicity)
import Snowflake from '@socialgouv/nextid';
const snowflake = new Snowflake(1n); // machine ID = 1
console.log(snowflake.nextId().toString()); // '1641024000000000001'

يمكنك اختبار إنشاء UUID مباشرة باستخدام مولد UUID IO Tools — يدعم UUID v1 إلى v7 وتمكين إنشاء كميات كبيرة دون الحاجة إلى تثبيت أي شيء.

أي معرف يجب أن تستخدمه؟

إليك التوصية الفعلية، وليس النسخة المُبهمة "يعتمد"

  • مُشاريع جديدة، بدون قيود وراثية: استخدم معرف الوحدة الموحدة. قابل للترتيب، آمن للروابط، مكثف. هو القيمة الافتراضية الأفضل.
  • مُستخدم UUID بالفعل، وتحتاج إلى تحسين أداء قاعدة البيانات: الانتقال إلى UUID v7. ترقية بسيطة، فائدة كبيرة في المؤشرات.
  • مُعرفات تُولّد من قبل العملاء أو عبر عقد غير موثوقة: استخدم CUID2. تُضمن المقاومة للتصادم حتى في الظروف المُضادة.
  • أنظمة ذات سرعة عالية (أكثر من 100 ألف معرف في الثانية)، ومستعد للتعامل مع معرفات الأجهزة: استخدم Snowflake. وإلا، لا تهتم.
  • UUID v4: فقط إذا كنت تُحافظ على كود قديم ولا يمكنك تغيير التنسيق. توقف عن استخدامه في الجداول الجديدة.

عصر الاعتماد على UUID v4 لكل شيء قد انتهى. ULID هو القيمة الافتراضية الجديدة لمعظم الاستخدامات، وUUID v7 هو المسار الصحيح للترقية إذا كنت بالفعل في عالم UUID. اختر واحد وانطلق.

هل تريد حذف الإعلانات؟ تخلص من الإعلانات اليوم

تثبيت ملحقاتنا

أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع

أضف لـ إضافة كروم أضف لـ امتداد الحافة أضف لـ إضافة فايرفوكس أضف لـ ملحق الأوبرا

وصلت لوحة النتائج!

لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!

إعلان · حذف؟
إعلان · حذف؟
إعلان · حذف؟

ركن الأخبار مع أبرز التقنيات

شارك

ساعدنا على الاستمرار في تقديم أدوات مجانية قيمة

اشتري لي قهوة
إعلان · حذف؟