تبدو خوارزميات رقم التحقق قائمة طويلة من وصفات لا تربطها صلة، إلى أن تلاحظ أنها صيغ مختلفة لفكرة واحدة. فكلها تأخذ الأحرف التي تسبق الموضع الأخير، وتعطي كل حرف وزنا، وتجمع النواتج، وتقسم على معامل، وتحول ما تبقى إلى الحرف الختامي.
وحين يصبح هذا الهيكل واضحا، يتحول الاختيار بين عائلات mod-10 و mod-11 و mod-97 من مسألة ذوق إلى مسألة مطابقة أربعة معاملات مع المهمة المطلوبة. تقارن هذه المقالة العائلات على هذا المستوى، وتترك الحساب التفصيلي لأي نظام بطاقات إلى الأدلة التي تخصه.
ما هي العائلات الرئيسية لخوارزميات رقم التحقق؟
التقسيم المعتاد يقوم على المعامل، لأن المعامل هو الذي يشكل بقية المعاملات كلها.
فعائلة mod-10 تقسم المجموع الموزون على عشرة، فيكون الباقي دائما رقما عشريا واحدا ولا يحتاج إلى أي تحويل إضافي. وعائلة mod-11 تقسم على أحد عشر، وهذا ينتج أحد عشر باقيا ممكنا؛ عشرة منها تتسع لرقم واحد، والحادي عشر يحتاج إلى تمثيل آخر. أما عائلة mod-97 فتقسم على سبعة وتسعين، ويلجأ إليها عادة عندما تكون المعرفات طويلة أو تحتوي على حروف.
والمعيار الدولي ISO 7064 هو الذي يجمع عدة أنظمة منشورة لأحرف التحقق من هذا النوع، ومنها ترتيب MOD 97-10 المستخدم في معرفات الحسابات العابرة للحدود. وتسمية العائلة تخبرك بشكل الحساب، لا بالمعاملات الدقيقة التي استقر عليها نظام بعينه، وهذا فرق يصبح مهما فور أن تضع هذه الإجراءات داخل خط تحقق عليه أيضا أن يفحص مجموعات الأحرف والأطوال.
كيف تختلف mod-10 و mod-11 و mod-97
كل الفروق التي تهم في العمل نتائج مباشرة للمعامل.
| العائلة | المعامل | الاستخدام المعتاد | الجزء الحرج فيها |
|---|---|---|---|
| mod-10 | 10 | معرفات رقمية قصيرة وأرقام بطاقات وأنظمة مشابهة | أوزانها متناظرة في بعض الترتيبات، وهذا يضعف كشف التبديل |
| mod-11 | 11 | معرفات أراد مصمموها كشف أخطاء أقوى | قيمة باقية واحدة لا تتسع لرقم واحد ولا بد من تحويلها أو تجنبها |
| mod-97 | 97 | معرفات طويلة، وخصوصا المختلطة بالحروف مثل أرقام الحسابات العابرة للحدود | يحتاج تحويل الحروف إلى أرقام أولا، فتعتمد معظم التنفيذات على مكتبة لا على كود مكتوب يدويا |
ونظام البطاقات الذي يغلق أرقامه بإجراء mod-10 يقوم على المضاعفة والجمع ينتمي إلى الصف الأول. ذلك الإجراء حساب mod-10 يحمل اسم بطاقة، والنظرة العائلية هي المفيدة هنا: الحساب نفسه يظهر في أنظمة الولاء وفي المعرفات الداخلية وفي عدة أنظمة ترقيم وطنية، ولهذا كثيرا ما يخطئ الإجراء المسمى باسم البطاقات عند استخدامه في مكان آخر. والصف الثالث هو الذي يقف خلف معرفات الحسابات الطويلة العابرة للحدود، وقد شرح خطوة بخطوة في مقالة بنية IBAN.
الأوزان والمعامل: المعاملات داخل العائلة الواحدة
داخل العائلة الواحدة تختلف الأعضاء في ثلاثة مواضع بالتحديد. الأول تسلسل الأوزان—أي المواضع تضرب في أي قيمة، وهل يتكرر النمط أم ينمو. والثاني هو المعامل نفسه، ويختار بما يناسب طول المعرف وحروفه. والثالث هو التحويل من الباقي إلى حرف التحقق، وهنا يقيم معظم التنوع الظاهر.
ويستحق هذا التحويل وقفة، لأنه الموضع الذي يضطر فيه النظام إلى اتخاذ قرار بشأن البواقي. فباقي mod-10 رقم واحد بحكم التكوين. أما باقي mod-11 فقد يكون عشرة، وعلى النظام إما أن يمنع التوليفات التي تنتجه، وإما أن يزحزح الناتج إلى مدى آخر، وإما أن يحجز له رمزا خاصا. وباقي mod-97 يحتاج بدوره إلى تخفيض مرة أخرى إلى أحرف التحقق التي يسمح بها النظام فعلا.
وتجاهل هذا القرار هو الطريق الأكثر شيوعا لانحراف التنفيذ المكتوب يدويا عن القاعدة المنشورة. فالحساب سيبدو صحيحا على المدخلات المريحة وسيفشل على المدخلات الحرجة.
لماذا تلتقط بعض الخوارزميات أخطاء التبديل؟
الأحرف المتجاورة تتبادل مواقعها باستمرار عندما يكتب شيء بيد إنسان، ولذلك فإن التقاط هذا الصنف من الأخطاء هدف تصميمي لا ميزة إضافية.
والآلية هي الأوزان. فحين يضرب النظام كل موضع بقيمة مختلفة، يؤدي تبديل الجارين إلى تغيير مقدار مساهمة كل منهما، ويتحرك المجموع معهما. أما حين تكون الأوزان متناظرة—القيمة نفسها على طرفي الزوج—فإن المساهمتين تتبادلان المكان فحسب ويبقى المجموع على حاله، فيمرر الفحص التبديل دون اعتراض.
ولهذا السبب يوجد عضو المضاعفة في عائلة mod-10 أصلا. فمضاعفة المواضع المتناوبة تجعل وزن كل موضع يعتمد على موقعه، وهذا يعيد القدرة على ملاحظة التبديل. وهو ليس مثاليا مع ذلك: فبعض الأزواج ينتج المجموع نفسه قبل التبديل وبعده، والوصف الدقيق لأي رقم تحقق هو أنه يلتقط كل خطأ يتعلق بحرف واحد، ومعظم التبديلات المتجاورة لا كلها.
أربعة أسئلة قبل اختيار خوارزمية
يصبح الاختيار أسهل عندما يعامل كمجموعة قصيرة من الأسئلة العملية لا كمسألة تفضيل شخصي.
- ما أقصى طول يمكن أن يبلغه المعرف، وهل الطول ثابت أم متغير؟
- أي الأحرف مسموح—أرقام فقط أم حروف أيضا؟
- هل الأخطاء المتوقعة تأتي من كتابة البشر، أم من إنتاج الآلات، أم من الاثنين؟
- ما الذي يحدث عندما ينتج الحساب حرف تحقق لا يتسع له التنسيق؟
والسؤال الرابع هو الذي تتخطاه الفرق عادة. فالنظام الذي قد ينتج باقيا من رقمين على حقل يتسع لرقم واحد يحتاج إما قاعدة للاستثناءات وإما معاملا يتجنبها، واكتشاف ذلك متأخرا يعني إعادة كتابة القاعدة لا تعديلها فقط.
وينتج عن ذلك عادتان. الأولى ألا تخترع معاملات من عندك: نفذ ما ينشره النظام، ثم أثبت صحة تنفيذك مقابل مواد النظام المنشورة نفسها. والثانية أنه حين يتشاطر نظامان في منتج واحد معظم حسابهما، فلتتشاطر التنفيذ وليختلف المعامل، بدل نسخ الإجراء وترك النسخ تتباعد.
للمطورين: تنفيذ واحد لعائلة كاملة
النظرة العائلية تسترد كلفتها في الكود. فإجراء واحد ممرر بتسلسل الأوزان والمعامل والتحويل يغطي كل عضو، ويصبح كل نظام جديد إعدادا لا ملفا جديدا. وهذا يبقي المراجعة قصيرة، لأن الحساب يراجع مرة واحدة والمعاملات تفحص سطرا سطرا.
وتفصيلان تصميميان يمنعان معظم المتاعب. الأول أن تعيد حرف التحقق المحسوب لا قيمة منطقية، حتى يستطيع المستدعي طباعة ما توقعه الحساب؛ فيبقى الفرق بين قيمة خاطئة ونظام غير مدعوم ظاهرا حتى أعلى الطبقات. والثاني أن تبقي خطوة التحويل صريحة في الإعداد، لأنها الجزء الذي يختلف بين الأنظمة والجزء الذي لا يتذكره أحد.
وكل مجموعات الأرقام التي استخدمت لبيان هذه المقالة وهمية—فالمعاملات الموصوفة معلومة عامة، أما السلاسل المثالية فقد بنيت للعرض ولا تصف أي رقم أصدره أي نظام.
الخطوات التالية
اسرد أنظمة الترقيم التي يتعامل معها منتجك وضع كل واحد منها في عائلة قبل أن تكتب أي شيء آخر. ثم أنشئ قيمة، وغير حرفا واحدا، وغير زوجا من الجيران، وتأكد من أن الحالتين تفشلان؛ وتعرض أداة التحقق من الأرقام النتائج التي ينبغي أن تفرقها الأداة، ومقالة بنية IBAN هي الحالة المشروحة لعائلة المعرفات الطويلة، بينما تشرح مقالة الأرقام بلا رقم تحقق ما يحدث عندما لا تكون هناك خوارزمية أصلا.