لماذا تحتاج GUID/UUID ولماذا هو أسهل مما تظن؟
\n\nهل تساءلت يومًا كيف تميز المواقع والتطبيقات بين سجل وآخر في قاعدة البيانات؟ أو كيف يتذكر متصفحك أن أنت من أضفت العناصر إلى سلة التسوق وليس جارك؟ غالبًا ما يكمن السر في سلسلة نصية صغيرة ولكنها قوية — GUID (المعرف الفريد عالميًا) أو أخيه الأكثر دقة UUID (المعرف الفريد الشامل).
\n\nعلى Stack Overflow، يجمع سؤال "How do I create a GUID / UUID?" آلاف المشاهدات. هذا ليس من قبيل الصدفة. كل مطور يواجه عاجلاً أم آجلاً مهمة: "أحتاج إلى معرف فريد، لكنني لا أريد إضافة مكتبة كاملة". اليوم سنشرح هذا الموضوع في JavaScript من البداية إلى النهاية. ستتعلم ليس فقط كيفية إنشاء UUID، بل وأي طريقة تختار لمهمتك.
\n\nهل أنت مستعد؟ لنبدأ!
\n\nما هو UUID حقًا؟ (ولماذا ليس سحرًا)
\n\nقبل كتابة الكود، دعنا نفهم النظرية. UUID هو رقم 128 بت يُكتب عادةً بصيغة سداسية عشرية مع شرطات. يبدو هكذا:
\n\n123e4567-e89b-12d3-a456-426614174000\n\nيصف معيار RFC 4122 عدة إصدارات من UUID. أشهرها:
\n- \n
- الإصدار 4: UUID عشوائي. تقريبًا كل ما تجده على الإنترنت هو هذا النوع. \n
- الإصدار 1: يعتمد على الوقت وعنوان MAC. قديم ولكنه موجود أحيانًا. \n
- الإصدار 5: يُنشأ من اسم (مثل URL) باستخدام تجزئة SHA-1. \n
الخاصية الرئيسية لـ UUID هي التفرد بدون خادم مركزي. احتمالية التصادم (تطابق معرفين) ضئيلة جدًا لدرجة يمكن تجاهلها. يُقال أنه إذا قمت بإنشاء مليار UUID في الثانية، فسيستغرق إنشاء مكرر حوالي 100 عام. ضمان جيد، أليس كذلك؟
\n\nالطريقة الأصح: crypto.randomUUID()
\n\nإذا كنت تكتب JavaScript حديثة (ES2020+)، فلديك حل مدمج — crypto.randomUUID(). هذه الطريقة متاحة في المتصفحات وNode.js (بدءًا من الإصدار 14.17.0).
\n\nإليك كيفية عملها:
\n\n// المتصفح\nconst myUUID = crypto.randomUUID();\nconsole.log(myUUID); // الإخراج: "f47ac10b-58cc-4372-a567-0e02b2c3d479"\n\n// Node.js (الإصدارات الحديثة)\nconst { randomUUID } = require('crypto');\nconst myUUID = randomUUID();\nconsole.log(myUUID);\n\nلماذا هو الخيار الأفضل؟
\n- \n
- الأمان: يستخدم مولد أرقام عشوائية آمن تشفيريًا. لا أنماط يمكن توقعها. \n
- المعيارية: يتوافق تمامًا مع RFC 4122 الإصدار 4. \n
- الأداء: مكتوب بلغة C++ تحت الغطاء، ويعمل بسرعة فائقة. \n
- بدون تبعيات: لا حاجة لتثبيت مكتبات خارجية. \n
هام: في المتصفحات القديمة (Internet Explorer، Safari قبل 15.4) قد لا تكون هذه الطريقة متاحة. إذا كنت تدعم هذه "الديناصورات"، تابع القراءة — لدينا خيارات بديلة.
\n\nالحيلة الكلاسيكية: Math.random() + قالب RFC 4122
\n\nقبل ظهور crypto.randomUUID()، كان المطورون يخترعون حلولاً بدائية. الخيار الأكثر شيوعًا هو استخدام Math.random() لتعويض الأرقام في قالب UUID. هذا الكود يتداول على الإنترنت منذ أكثر من 10 سنوات:
\n\nfunction generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\nconsole.log(generateUUID()); // الإخراج: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"\n\nكيف يعمل هذا؟
\n- \n
- القالب
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxيحدد التنسيق. \n - الرمز 'x'