هل تحتاج إلى معرّف لن يتعارض مع معرّف أنشأه شخص آخر، على جهاز لم تسمع به من قبل، دون طلب الإذن من أي شخص؟ هذه هي الوظيفة التي يؤديها UUID. إنه رقم مكون من 128 بت، يُكتب على شكل 36 حرفاً بالنمط المألوف 8-4-4-4-12، وتصميمه بالكامل يضمن ألا يكون هناك اثنان متطابقان على الإطلاق حتى وإن لم ينسق أحد من سيحصل على أي منها. يقوم هذا المولد المجاني بإنشائها في متصفحك: اختر إصداراً في الإصدار، وحدد العدد الذي تحتاجه في العدد، واضغط على توليد. تفتح الصفحة على معرّف v4 واحد، وهو الإصدار الذي تريده معظم المشاريع، لذلك فإن أول معرّف يبعد عنك نقرة واحدة.
يتم بناء كل معرّف بواسطة متصفحك من خلال Web Crypto API. يستخدم الإصدار 4 crypto.randomUUID() حيثما يوفره المتصفح و crypto.getRandomValues() بخلاف ذلك — وهو مصدر عشوائي قوي تشفيرياً بدلاً من دالة JavaScript شبه عشوائية مثل Math.random(). يضع الإصدار 7 طابعاً زمنياً بالمللي ثانية مكوناً من 48 بت في المقدمة، ثم عداداً مكوناً من 12 بت يزداد خلال نفس المللي ثانية، ثم 62 بتاً عشوائياً، وهو أسلوب الترتيب الموصوف في RFC 9562؛ هذا العداد هو السبب في أن دفعة من الألف تخرج مرتبة بدلاً من أن تكون مبعثرة. يجمع الإصدار 1 بين طابع زمني من عام 1582 ومعرّف عقدة عشوائي تم تعيين بت البث المتعدد فيه، لذلك لا يحمل أبداً عنوان بطاقة الشبكة الخاصة بك بالطريقة التي فعلتها التطبيقات الأصلية في التسعينيات. الإصداران 3 و 5 ليسا عشوائيين على الإطلاق: فهما يقومان بتجزئة مساحة اسم مع اسم، باستخدام MD5 و SHA-1 على التوالي، وهذا التجزئة يحدث أيضاً على جهازك. لا يتم إرسال أي شيء إلى خادم، ولا يتم تسجيل أي شيء، وبمجرد تحميل الصفحة تستمر في العمل حتى عند انقطاع الاتصال.
حقل الإصدار هو الذي يقرر كل شيء آخر. الإصدار 4 عبارة عن 122 بتاً عشوائياً وبدون أي بنية — وهو الخيار الافتراضي، والإجابة الصحيحة عندما يكون المعرّف مطلوباً ليكون فريداً فقط. يحتفظ الإصدار 7 بـ 62 بتاً عشوائياً ولكنه يبدأ بوقت إنشائه، لذلك تُفرز مجموعة منها بالترتيب الذي صُنعت به؛ وهذا ما يجعله الإصدار المناسب عندما يصبح المعرّف مفتاحاً لقاعدة بيانات (primary key). الإصدار 1 هو المخطط الأصلي المعتمد على الوقت، وقد تم الاحتفاظ به هنا للأنظمة التي لا تزال تطلبه. الإصداران 3 و 5 هما الزوج الغريب: فهما حتميان، مما يعني أن نفس المدخلات تنتج دائماً نفس المعرّف، ويأخذان حقلين إضافيين — مساحة الأسماء، وهو أحد المساحات القياسية DNS و URL و OID و X.500 أو الخيار مخصص لمساحة خاصة بك، وحقل الاسم، وهو السلسلة النصية التي يتم تحديدها. إذا أعطيت v5 مساحة الاسم URL والرابط https://example.com/a، فستحصل على نفس UUID اليوم وغداً وعلى جهاز شخص آخر. وبسبب ذلك، يختفي حقل العدد عند اختيار v3 أو v5: فألف نسخة من قيمة حتمية واحدة ستكون مجرد ألف نسخة من نفس القيمة الحتمية. بالنسبة لأي إصدار آخر، يتراوح العدد من 1 إلى 1000.
تعمل أربعة مفاتيح على تغيير شكل المخرجات دون تغيير الـ 128 بت الموجودة تحتها. خيار أحرف كبيرة يطبع الأرقام الست عشرية بحروف كبيرة، وخيار بدون شرطات يعطي الشكل المدمج المكون من 32 حرفاً والذي تفضله بعض الأعمدة وأسماء الملفات، وخيار الأقواس المعقوفة يغلف القيمة بين { } — وهو الشكل الذي تطلق عليه أنظمة Windows وعالم .NET اسم GUID. ضمن خيارات متقدمة، يضيف urn:uuid: البادئة التي تجعله URN رسمياً؛ ويقوم بإيقاف تشغيل الأقواس المعقوفة وبدون شرطات أثناء تفعيله، لأن المعيار يسمح بنموذج URN واحد تماماً وهو النموذج القياسي المزوّد بالشرطات. يحدد تنسيق النسخ كيف يتم دمج الدفعة عند نسخها: واحد لكل سطر، أو مفصولة بفواصل، أو كل قيمة بين علامتي اقتباس متبوعة بفاصلة، ليتم لصقها مباشرة في مصفوفة في الكود. أسفل النتيجة يوجد سطر يوضح مقدار العشوائية بالبت — 122 للإصدار v4، و 62 للإصدار v7 — وبالنسبة للإصدار v7، يوضح الطابع الزمني المشفر في المعرّف الأول للدفعة، ليكون الوقت داخل القيمة مرئياً بدلاً من كونه ضمنياً. يحترم كل من نسخ الكل وحفظ إلى ملف إعدادات تنسيق النسخ. يحتفظ السجل بآخر 10 دفعات قمت بها في متصفحك الخاص: انقر على إحداها لاسترجاعها، أو انسخ أو احذف إدخالاً واحداً، أو امسح المجموعة بأكملها. يفرغ مسح النتيجة ويترك إعداداتك كما هي، وبعد تجاوز 50 معرّفاً تصبح القائمة كتلة واحدة قابلة للتمرير بدلاً من خمسين سطراً.
إن الأمر الأكثر أهمية في هذه الصفحة هو الفرق بين v4 و v7 كمفتاح أساسي (primary key)، وهو ليس مجرد مسألة تفضيل. فهارس قواعد البيانات عبارة عن أشجار B-tree محفوظة بترتيب مفروز، والمكان الذي يهبط فيه المفتاح الجديد في هذا الترتيب يحدد مقدار العمل الذي تكلفه عملية الإدراج. نظراً لأن مفتاح v4 عشوائي، فإن الإدراجات المتتالية تهبط في زوايا غير مترابطة من الفهرس: الصفحات التي كانت ممتلئة تنقسم (page split)، والأجزاء من الشجرة التي تحتفظ بها قاعدة البيانات في الذاكرة نادراً ما تكون هي الأجزاء التي يحتاجها الإدراج التالي، وينمو الفهرس ببطء أكبر مما تستحقه البيانات التي يشير إليها. يبدأ مفتاح v7 بالمللي ثانية الحالية، لذلك تهبط الإدراجات المتتالية بجوار بعضها البعض على الحافة اليمنى للشجرة، وهو النمط الذي ينتجه عدد صحيح يتزايد تلقائياً والنمط الذي بنيت حوله هياكل الفهارس. هذه هي المقايضة بأكملها: يمنحك v7 سلوك إدراج المفتاح التسلسلي مع الاحتفاظ بالخاصية التي جعلتك تختار UUIDs في المقام الأول، وهي أن أي شخص يمكنه صك واحد دون سؤال خادم. التكلفة هي أن وقت الإنشاء أصبح الآن مقروءاً داخل المعرّف، وما إذا كان ذلك مهماً فهو سؤال حول بياناتك، وليس حول التنسيق.
لا شيء يتحقق أبداً من تفرد UUID؛ فحجمه هو الضمان. لا يوجد سجل، ولا رحلة ذهاب وإياب للخادم، ولا بحث — يُنتج المولد رقماً ويسلمه، والسبب في عدم تعارض اثنين منها هو ببساطة أن هناك 2^122 من القيم الممكنة للإصدار v4، أي حوالي 5.3 أنديسيليون. مفارقة تاريخ الميلاد (birthday problem) هي الطريقة الصادقة لتقدير ذلك: ستحتاج تقريباً إلى 2.7 كوينتيليون معرّف قبل أن تكون هناك فرصة متساوية لتطابق أي اثنين منها، وهو ما يعادل مليار UUID جديد كل ثانية لمدة 86 عاماً. يجدر بنا أن نكون دقيقين بشأن ما يعد به هذا وما لا يعد به. إنها ضمانة إحصائية، وليست حسابية، وهي تصمد فقط طالما أن العشوائية الأساسية حقيقية — فالمولد الذي أُعطي بذرة سيئة، أو الآلة الافتراضية المستنسخة مع تجمع الإنتروبيا الخاص بها، يكسر هذه الضمانة بطريقة لا يستطيع التنسيق اكتشافها. يضيق الإصدار 7 السؤال أكثر: داخل مللي ثانية واحدة، لا يمكن لمولد واحد أن يكرر نفسه على الإطلاق، لأن العداد يزداد بدلاً من رمي النرد، وعبر المولدات المستقلة تتولى 62 بتاً عشوائياً القيام بالعمل.
إن UUID هو معرّف، وليس كلمة مرور. الإصدار 4 غير متوقع، وهذا يغري الناس للتعامل معه كسر — رابط لإعادة تعيين كلمة المرور، رابط URL لا يمكن تخمينه، رمز جلسة، أو مفتاح API. عدم القدرة على التنبؤ أمر حقيقي، لكن السرية هي خاصية تتعلق بكيفية التعامل مع القيمة، ويتم التعامل مع المعرّفات بإهمال بحكم تصميمها: فهي موجودة في عناوين URL، والتي ينتهي بها المطاف في سجل المتصفح، وسجلات الخادم، ورؤوس المُحيل، والتحليلات، ويتم لصقها في رسائل الدردشة. الإصدارات الأخرى مرشحة بأسوأ من ذلك. يقوم كل من الإصدار 1 والإصدار 7 بتشفير لحظة الإنشاء، لذلك فإن أي شخص يحمل أحدهما يعرف تقريباً متى تم صنعه ويمكنه تضييق نطاق كل شيء صُنع بجانبه. الإصداران 3 و 5 حتميان عن قصد: إن UUID v5 لعنوان بريد إلكتروني ليس سراً مجزأً، بل هو قيمة يمكن لأي شخص لديه نفس العنوان حسابها في ثانية. استخدم UUID لتسمية شيء ما. استخدم مولد كلمات مرور، أو رمزاً مميزاً من مكتبة مخصصة للأسرار، عندما يجب أن تظل القيمة غير معروفة.
لماذا أستخدم أداة توليد UUID هذه؟
- التوليد داخل المتصفح فقط: يتم إنشاء المعرّفات على جهازك ولا تُرسل أبداً إلى أي مكان
- عشوائية Web Crypto API: آمنة تشفيرياً، وليست Math.random()
- خمسة إصدارات في مكان واحد: v1 و v3 و v4 و v5 و v7، بدون التبديل بين الأدوات
- v7 مرتب ترتيباً حقيقياً: عداد داخل المللي ثانية، كما يصف RFC 9562
- v3 و v5 حتميان مع مساحات الأسماء الأربع القياسية أو مساحتك الخاصة
- حتى 1000 دفعة واحدة، مع قائمة مدمجة قابلة للتمرير بعد الخمسين
- كل الأشكال الشائعة: بفاصلة، مجرد، بأحرف كبيرة، بأقواس، أو بتنسيق URN مثل urn:uuid:
- نسخ كأسطر، أو فواصل، أو قيم مقتبسة لتُلصق مباشرة في الكود
- غير محدود ومجاني: لا تسجيل، لا حدود استخدام، ولا شيء على خوادمنا
تظهر معرّفات UUID في أي مكان يجب تسمية شيء فيه قبل أن يؤكد أي شيء آخر أن هذا الاسم متاح. يصك كود التطبيق معرّفات للصفوف التي يوشك على إدراجها، بحيث يكون للكائن هوية قبل أن يصل إلى قاعدة البيانات ويمكن للعميل الإشارة إليه بينما لا تزال عملية الكتابة قيد التقدم. تعتمد الأنظمة الموزعة عليها بقوة أكبر: عدة خدمات تكتب في جدول واحد، عميل هاتف محمول غير متصل بالإنترنت ينشئ سجلات على طائرة، قائمة انتظار يجب أن تتعرف على الرسالة التي عالجتها بالفعل — لا شيء من هذه يمكنه انتظار دوره للحصول على عداد مشترك. يغطي الإصدار 5 حاجة مختلفة، وهي معرّف مستقر مستمد من شيء تمتلكه بالفعل: نفس المستند، أو نفس الـ URL، أو نفس الحساب يُترجم دائماً إلى نفس الـ UUID، بحيث يمكن تشغيل عملية استيراد مرتين دون تكرار أي شيء. في أماكن أخرى، هي ببساطة التنسيق الذي يطلبه النظام — معرّف ارتباط يمر عبر السجلات والتتبعات، اسم ملف لن يتعارض عندما تهبط تحميلات من ألف مستخدم في حاوية واحدة، مفتاح سجل Windows، أو أداة اختبار (test fixture) يجب أن تبدو كبيانات حقيقية.
هناك بعض الحدود الصادقة التي تستحق المعرفة. الدفعة الواحدة تعني إصداراً واحداً: القيمة الموجودة في الإصدار تنطبق على كل ما بداخلها، لذلك فإن تشغيل v4 وتشغيل v7 هما دفعتان. هذا مولد، وليس فاحصاً — إن لصق UUID لقراءة إصداره أو طابعه الزمني ليس شيئاً تفعله هذه الصفحة. خيار حفظ إلى ملف يكتب ملفاً نصياً عادياً بدلاً من CSV أو JSON. يكشف الإصدار 7 صراحة عن وقت إنشائه، وصولاً إلى المللي ثانية، وهو تبادل حقيقي وليس عيباً، ويسرب الإصدار 1 الوقت بنفس الطريقة؛ إذا كان ذلك يمثل مشكلة لبياناتك، فإن الإصدار 4 هو الإصدار الذي لا يخبر أحداً بأي شيء. لا يُعدّ قيمتان خاصتان من المعيار إصدارين وبالتالي ليسا ضمن خيارات الإصدار، ولكن يمكنك نسخهما من هنا: nil UUID وهو 00000000-0000-0000-0000-000000000000، و max UUID وهو ffffffff-ffff-ffff-ffff-ffffffffffff. كل شيء في هذه الصفحة يتبع RFC 9562، وهي المواصفة التي حلت محل RFC 4122 في عام 2024، لذلك يتم قبول المخرجات بواسطة أي مكتبة أو قاعدة بيانات أو API تتعامل مع معرّفات UUID على الإطلاق. ضمن تلك الحدود، فإن الضمانة قوية: يتم بناء كل معرّف وفقاً للمعيار، من عشوائية آمنة تشفيرياً، على جهازك الخاص، ولا يراه أي شخص آخر أبداً.