أدوات المطور · مولد UUID
Nil وMax UUIDs: القيمتان الخاصتان ومتى يتم استخدامهما
· خلفية
uuid سير عمل المطور التحقق من صحة البيانات
لقد كان الصفر الشامل UUID في المعيار منذ 2005 وانضم الكل F Max UUID إلى 2024. يشرح هذا المنشور غرضهم، وكيفية تفاعلهم مع المدققين، وأخطاء القيمة الحارسة التي يجب تجنبها.
الصف ذو المعرف 00000000-0000-0000-0000-000000000000 — كيف يصبح العنصر النائب خطأ في الإنتاج
الصف الذي يكون معرفه 00000000-0000-0000-0000-000000000000 يمكن أن يبدو على شكل UUID بينما يحمل معنى مختلفًا عن المعرف الذي تم إنشاؤه. إذا كان أحد التطبيقات يستخدم تلك القيمة بهدوء لـ "لم يتم تعيينه بعد"، فإن كل صف غير مكتمل يشترك في نفس العلامة. التعليمات البرمجية التي تفترض أي أسماء UUID مقبولة قد يطلبها كائن حقيقي أو يخزنها مؤقتًا أو ينضم إليها كما لو كان مفتاحًا عاديًا. لا ينقل التنسيق المرئي قاعدة العمل؛ فقط العقد الحارس الصريح يفعل ذلك.
يبدأ خطأ الإنتاج عندما تعرف إحدى الطبقات عن العنصر النائب ولا تعرفه طبقة أخرى. قد يرسل النموذج Nil، وقد يقبله API، وقد تخزنه طبقة الثبات، بينما يعامل العامل المتلقي للمعلومات كل سلسلة غير فارغة كمفتاح خارجي قابل للاستخدام. الفشل ليس أن Nil مشوه. ToolAcre تعرف عليه عمدًا. الفشل هو السماح بانهيار "النص الصالح" و"المعرف الذي تم إنشاؤه" و"العلاقة المخصصة" في شرط واحد غير محدد.
Nil UUID - تعريفه، ولماذا يفشل تقنيًا كل إصدار ومتغير في التحقق منه
في التنفيذ المحدد، Nil هي السلسلة الأساسية ذات الصفر. يتلقى فرعًا مخصصًا قبل اختبار النمط UUID العادي، لذلك يُرجع isValidUuid صحيحًا على الرغم من أن التعبير العادي يتطلب رقم إصدار من 1 إلى 8 وقائمة متغيرة RFC من 8 إلى b. يتبع InspecTUuid نفس الاستثناء: فهو يُبلغ عن قيمة صالحة، ويعين الإصدار 0، ويقول إن UUID كلها صفر بت وليست عشوائية. يعد هذا سلوكًا للتطبيق تم التحقق منه، وليس ادعاءً عامًا بأن كل مدقق يجب أن يقوم بنفس الاختيار.
هذا الفرع مهم لأن Nil لا يمرر مسار الإصدار والمتغير العادي المستخدم للمعرفات التي تم إنشاؤها. تحمل قيمة ToolAcre الإصدار-4 4 في موضع الإصدار وواحدة من 8، أو 9، أو a، أو b في الموضع المتغير؛ الصفر يحمل صفرًا في كلا المكانين. إن تسمية هذه الشيكات بأنها "فشلت" دون ذكر الاستثناء سيكون أمرًا مضللاً. يتعرف المدقق أولاً على القيمة الخاصة، ثم يتجاوز النمط العادي حسب التصميم. يحتاج المستهلكون إلى طلب واضح بنفس القدر إذا قبلوه.
يعد Nil UUID استثناءً صريحًا وصالحًا في ToolAcre، وتم الإبلاغ عنه كإصدار 0
لا تتلقى السلسلة ffffffff-ffff-ffff-ffff-ffffffffffff أي فرع خاص في هذا المستودع. كما أنه يفشل في النمط العادي لأن f خارج نطاق الإصدار المقبول وخارج مجموعة nibble المقبولة RFC. وبالتالي، فإن ToolAcre يُبلغ عنها على أنها غير أساسية بدلاً من التعامل معها على أنها لا شيء. ينسب المصنف محفوظات التقييس وغرض حدود النطاق إلى Max، ولكن لا سجل الأداة أو التنفيذ أو الاختبارات يتحقق من هذه المطالبات، لذلك لا تكررها هذه المقالة.
يعد هذا الاختلاف أكثر فائدة من السجل غير المدعوم: Nil هو ثابت مسمى مع سلوك تم اختباره، بينما Max هو إدخال يرفضه المدقق. قد يحدد المشروع دلالات خافرة إضافية في البروتوكول الخاص به، ولكن لا يجب استنتاج هذا الاختيار من ToolAcre. إذا كانت إمكانية التشغيل البيني تعتمد على قبول قيمة الكل f، فقم بتوثيق تلك القاعدة واختبارها في النظام المالك. لا تفترض أن كل مكتبة ستصنف سلسلة على شكل UUID بشكل مماثل.
تم رفض قيمة الكل f Max بواسطة ToolAcre؛ لم يتم تأكيد أي سجل RFC أو الاستخدام المقصود للنطاق
يجيب الحارس والقيمة الخالية على أسئلة مختلفة فقط عندما ينص المخطط على ذلك. يمكن أن يمثل Null غياب العلاقة بشكل مباشر. يحافظ الحارس على ملء العمود وقد يكون مفيدًا عندما لا يمكن للواجهة المحيطة أن تحمل قيمة خالية، ولكنه ينشئ قيمة تشبه البيانات وبالتالي تنتقل عبر الفهارس والروابط والمتسلسلات وذاكرة التخزين المؤقت. إن الراحة الواضحة تنقل المسؤولية إلى كل قارئ: يجب على كل قارئ أن يتذكر أن الشخص المقبول UUID لا يذكر اسم الكيان المعين.
تصبح هذه التجارة فخًا عندما يتمكن الحارس من تلبية فحص شكل المفتاح الخارجي دون تلبية معنى العلاقة. ويمكنه أيضًا طمس الحالات المميزة مثل غير معروف، أو غير مخصص عمدًا، أو محذوف، أو لم تتم معالجته بعد. إذا كانت هذه الحالات تؤثر على السلوك، فقم بتمثيلها بشكل صريح بدلاً من التحميل الزائد على معرف سحري واحد. عندما يتم الاحتفاظ بـ "لا شيء" من أجل التوافق، أعط الدولة معنى موثقًا واحدًا، وارفضه في كل مكان آخر، وقم بتحويله إلى حدود مملوكة بشكل واضح بدلاً من تشتيت المقارنات عبر كود الأعمال.
أدوات التحقق من الصحة والقيم الخاصة - لماذا قد يؤدي فحص الإصدار الصارم /variant إلى رفض Nil وMax، وكيفية تحديد ما إذا كان ينبغي فحصك أم لا
ToolAcre يوضح طبقتين داخل أداة التحقق واحدة. يتم قطع الإدخال العادي، وإزالة الأقواس الخارجية الاختيارية، ويتم فحص السلسلة المتبقية مقابل التخطيط الأساسي 8-4-4-4-12 بالإضافة إلى الإصدار المقبول والمواضع المختلفة. يتم اختبار Nil قبل هذا النمط ويتم قبوله عمدًا. ماكس ليس لديه استثناء ويفشل. وهذا يعني أن المتصل لا يمكنه التنبؤ بسياسة القيمة الخاصة من التعبير العادي وحده؛ يعد تدفق التحكم المحيط بالنموذج جزءًا من عقد التحقق من الصحة.
صمم سياستك الخاصة من خلال فصل ثلاثة أسئلة. أولاً، هل يمكن التعرف على النص في الأشكال التي تسمح بها حدودك؟ ثانيًا، هل القيمة عادية UUID أم استثناء مسمى؟ ثالثا، هل هذه الفئة مسموحة لهذا المجال والعملية؟ قد ترفض نقطة نهاية الإنشاء Nil حتى عندما يتعرف عليها المحلل اللغوي، في حين أن حد الاستيراد قد يترجم علامة Nil القديمة الموثقة إلى فارغة. إن إرجاع هذه النتائج بشكل منفصل يمنع "قبول المحلل اللغوي" من أن يصبح إذنًا عرضيًا لتخزينها.
ToolAcre يقبل Nil بشكل صريح ويرفض Max ضمن نمط الإصدار والمتغير الخاص به
خذ بعين الاعتبار جدول المهام الذي يحتوي على معرف المكلف الذي يستخدم Nil لـ "غير معين". يظهر استعلام مكتوب كـ WHERE signee_id IS NOT NULL لتحديد المهام المعينة، ولكنه يحدد أيضًا كل صف لا شيء لأن الحارس عبارة عن سلسلة محددة. قد تقوم الصلة بعد ذلك بإسقاط تلك الصفوف إذا لم يكن لدى أي مستخدم هذا المفتاح، مما ينتج عنه نتيجة ثانية أقل وضوحًا. كلا الاستعلامين معقولان محليًا؛ إنهم يختلفون لأن المخطط أخفى الحالة داخل معرف ذو مظهر عادي بدلاً من الكشف عن المهمة مباشرة.
الحل الدائم هو نمذجة المهمة كمهمة: استخدام علاقة فارغة عندما يسمح عقد التخزين بذلك، أو إضافة حالة صريحة عندما يجب التمييز بين عدة حالات. إذا كان حد التوافق لا يزال يرسل Nil، فقم بترجمته مرة واحدة قبل الثبات واعكس التعيين فقط لهذا الحد. ثم قم باختبار قيم الإصدار 4، وNil، وMax، والإدخال الفارغ، والنص المشوه كحالات منفصلة. يجب أن يقرر التطبيق كل نتيجة بدلاً من وراثة أي إجابة يحدثها فحص التنسيق العام.
الخلاصة: تحتاج القيم الخاصة إلى معالجة صريحة - قم بإنشاء معرفات حقيقية باستخدام المولد ToolAcre وتعامل مع Nil وMax كاستثناءات متعمدة
تحتاج القيم الخاصة إلى معالجة مسماة لأن شكلها لا يمكن أن يحمل هدف تطبيقك. ToolAcre يُنشئ إصدارًا عاديًا - 4 UUIDs من Web Crypto، ويتراجع من RandUUID إلى getRandomValues عند الضرورة ويرفض استخدام مصدر عشوائي غير آمن. يمكن للمفتش الخاص به بعد ذلك التمييز بين القيمة التي تم إنشاؤها واستثناء Nil المعترف به بشكل صريح. وهذا يجعل الأداة مفيدة للمراقبة، ولكنها لا تختار سياسة حراسة قاعدة البيانات أو تثبت أن المعرف المقبول ينتمي إلى سجل موجود.
استخدم المولد للمعرفات الجديدة، وتعامل مع كل حارس باعتباره قرارًا بروتوكوليًا منفصلاً. في المدقق الحالي، Nil صالح، الإصدار 0، وليس عشوائيًا؛ ماكس مرفوض. حافظ على هذا التمييز عند اختبار الصفحة، ثم قارنه بقواعد لغتك وقاعدة بياناتك وAPI قبل قبول أي من القيمتين. إن الفكرة الآمنة ضيقة بشكل متعمد: المعرفات التي تم إنشاؤها، واستثناءات المحلل اللغوي، والعلاقات المفقودة، وحالات العمل هي مفاهيم مختلفة، والحدود القوية تجعلها مختلفة.