security · 6 دقائق قراءة

إصدارات UUID — v4 وv7 وأيّها تستعمل

اثنان وثلاثون رقمًا ستّ عشريًّا يستطيع جهازان توليدها كلٌّ على حدة دون أن تتصادم أبدًا. الجزء المثير هو ما أصلحه الإصدار الأحدث.

المعرّف الفريد عالميًّا 128 بتًّا، تُكتب اثنين وثلاثين رقمًا ستّ عشريًّا في خمس مجموعات تفصلها شرطات. المقصد أن أي شيء يستطيع توليد واحد في أي وقت دون تنسيق مع أي شيء آخر، ولن تتصادم النتيجة.

تلك الخاصّية هي ما يجعل الأنظمة الموزّعة ممكنة بلا عدّاد مركزي — وهي أيضًا ما جعلها ثقيلة مفاتيحَ لقواعد البيانات، حتى جاء v7.

الإصدارات التي تستحقّ المعرفة

v4 — عشوائي. 122 بتًّا عشوائيًّا، وستّة محجوزة لعلامات الإصدار والصيغة. هو الافتراضي في كل مكان تقريبًا، والجواب الصحيح حين تريد معرّفًا لا يكشف شيئًا.

v7 — عشوائي مرتَّب زمنيًّا. أول 48 بتًّا طابع زمني بالميلي ثانية؛ والباقي عشوائي. صار معيارًا سنة 2024، وهو الآن الخيار الموصى به لكل ما يصير مفتاحًا رئيسيًّا.

v5 — مشتقّ من اسم. يحسب بصمة فضاء أسماء وسلسلة، فيعطي المدخل نفسه المعرّف نفسه دائمًا. مفيد لمعرّفات ثابتة تُشتقّ من مفاتيح طبيعية، وليس عشوائيًّا إطلاقًا.

v1 — طابع زمني وعنوان MAC. الأصل. يضمّن عنوان شبكة الجهاز المولِّد، وذلك إفشاء لا يقصده أحد، ويستحقّ التجنّب لهذا السبب وحده.

لماذا v4 قاسٍ على قاعدة البيانات

هذه هي الحجّة العملية، وهي ليست بديهية.

فهرس قاعدة البيانات مرتَّب. إدخال صفّ بعدد صحيح متزايد يُلحق دائمًا في الآخر، فتبقى الصفحة نفسها في الذاكرة وتكون الكتابة رخيصة.

المعرّفات العشوائية تحطّ في كل مكان. فكل إدخال يلمس صفحة مختلفة، وتصير مجموعة العمل الفهرسَ كلّه لا ذيله، وتنقسم الصفحات مرارًا، ويتفتّت الفهرس. على جدول كبير هذا هو الفرق بين كتابة سريعة وأخرى بطيئة.

v7 يعيد الترتيب. فالمعرّفات المولَّدة متقاربة في الوقت ترتَّب متقاربة، فتتجمّع الإدخالات في الآخر من جديد — مع الحفاظ على الاستقلال الذي جعل معرّفات UUID تستحقّ الاقتناء.

التصادمات، بصراحة

122 بتًّا عشوائيًّا تعني نحو 5.3 × 1036 احتمال. لبلوغ احتمال تصادم واحد بنسبة واحد في المليار تحتاج إلى توليد نحو 2.7 × 1018 منها.

بمليون في الثانية يكون ذلك نحو خمسة وثمانين ألف سنة. الاحتمال لا يُذكر أمام كل أنواع الأعطال الأخرى في النظام.

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

حين يكون سرًّا

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

أما v1 وv7 فلا، ويستحقّ ذلك وضوحًا. كلاهما يضمّن طابعًا زمنيًّا، فمن يعرف تقريبًا متى صدر رمز يكون قد أزال معظم فضاء البحث. v1 ينشر فوق ذلك عنوان MAC للجهاز الذي صنعه.

فالإصدار الأفضل مفتاحًا لقاعدة البيانات هو الخطأ حين يكون سرًّا. استعمل v7 للصفوف وv4 — أو سلسلة عشوائية مصنوعة لهذا الغرض — لكل ما يجب ألّا يُخمَّن.

كيف تخزّنها

المعرّف نصًّا 36 محرفًا. بالبايتات هو 16، فيستحقّ عمود UUID الأصلي الاستعمال حيث توفّره قاعدة البيانات — أقل من نصف التخزين، وكل مدخلة فهرس أصغر.

حيث لا يوجد نوع أصلي، تغلب 16 بايتًا خامًا سلسلةً من 36 محرفًا، بكلفة أنها غير مقروءة في نتيجة استعلام.

الخلاصة

v4 افتراضيًّا، وv7 لكل ما يصير مفتاحًا رئيسيًّا، وv5 حين يجب أن يعطي المدخل نفسه المعرّف نفسه دائمًا، ولا v1. التصادمات ليست همًّا حقيقيًّا؛ أما مصدر العشوائية الضعيف فنعم. يبقى v7 سرًّا رديئًا، لأن نصفه هو الساعة.

أسئلة

ما الفرق بين UUID v4 وv7؟

v4 عشوائي بالكامل. v7 يضع طابعًا زمنيًّا بالميلي ثانية في أول 48 بتًّا ويملأ الباقي عشوائيًّا، فترتَّب المعرّفات المولَّدة حسب وقت إنشائها. كلاهما عمليًّا في مأمن من التصادم؛ لكنّ v7 أرفق بكثير بفهرس قاعدة البيانات.

هل يمكن أن يتطابق معرّفا UUID؟

نظريًّا نعم، عمليًّا لا. معرّف v4 فيه 122 بتًّا عشوائيًّا، وستحتاج إلى توليد نحو 2.7 × 10^18 منها قبل أن يبلغ احتمال التصادم واحدًا في المليار. الخطر أدنى بكثير من خطر عطل العتاد.

لماذا v7 أفضل لمفاتيح قواعد البيانات؟

المعرّفات العشوائية تبعثر الإدخالات على الفهرس كله، فكل كتابة تلمس صفحة مختلفة ويتفتّت الفهرس. أما v7 فمرتَّب زمنيًّا، فتحطّ الصفوف الجديدة معًا في الآخر — وهي الخاصّية نفسها التي جعلت الأعداد الصحيحة المتزايدة سريعة، لكن بلا عدّاد مركزي.

هل يجوز استعمال معرّفات UUID رموزًا سرّية؟

معرّف v4 من مصدر عشوائي معمّى لا يمكن تخمينه ويصلح معرّفًا غير قابل للتخمين. أما v1 وv7 فلا — فـv1 يضمّن عنوان MAC وطابعًا زمنيًّا، وv7 يضمّن طابعًا زمنيًّا، فكلاهما يسرّب معلومات ويمكن توقّع جزء منه.

كم إصدارًا من UUID يوجد؟

ثمانية معرَّفة. أربعة منها تهمّ: v1 القائم على الوقت وعنوان MAC، وv4 العشوائي، وv5 المشتقّ من اسم اشتقاقًا ثابتًا، وv7 العشوائي المرتَّب زمنيًّا. يبقى v4 الافتراضي الشائع، وv7 هو الذي يستحقّ الانتقال إليه لمفاتيح قواعد البيانات.

أدوات من هذا الدليل

المزيد من أدوات الأمان — كلّها تعمل في متصفّحك، ولا واحدة منها ترفع ملفًّا.