خوارزمية Luhn هي السبب في أن رقم البطاقة ينتهي برقم يبدو اعتباطيا. إنها مجموع تحقق، أي خلاصة حسابية صغيرة لكل رقم سبقه، وهي الفحص الآلي الأكثر شيوعا الذي يجب أن يجتازه رقم البطاقة قبل أن يحدث أي شيء آخر. وضعت في شركة IBM في خمسينيات القرن الماضي على يد هانز بيتر لوهن، ثم صارت عرفا لبطاقات الدفع عبر المعيار الدولي الذي ينظم ترقيم البطاقات.
تشرح هذه المقالة الغرض من رقم التحقق، وكيف تحسبه على الورق، ولماذا يكشف معظم أخطاء الكتابة، ولماذا يعني اجتيازه أقل بكثير مما يتصور الناس.
ماذا تفعل خوارزمية Luhn
خذ رقم البطاقة، واعزل الرقم الأخير، ثم مرر بقية الأرقام في إجراء ثابت. تحدد النتيجة ما يجب أن يكون عليه الرقم الختامي. ويقبل الرقم عندما يكون الرقم الختامي متسقا مع كل ما يسبقه.
لا يشمل هذا الإجراء بنكا ولا قائمة حسابات ولا سرا. إنه حساب رياضي منشور في الكتب، ومنقول إلى كل لغة برمجة تقريبا، ويمكن إنجازه في جزء من أجزاء الألف من الثانية. وهو يجيب عن سؤال واحد ضيق: هل تحتوي هذه السلسلة على خطأ نسخ واضح؟
سهل أن تنسى هذا الضيق. فبما أن مجموع التحقق هو الفحص الآلي الأبرز في نموذج الدفع، يبدأ الناس في الاعتقاد أنه يقول أكثر مما يقول.
كيف تحسب رقم التحقق يدويا؟
يجري الإجراء من اليمين إلى اليسار على الأرقام الباقية بعد حذف الرقم الختامي.
- اكتب الأرقام، ورقم مواقعها من اليمين بدءا من الواحد.
- ضاعف كل رقم يقع في موقع زوجي.
- إذا تجاوز الناتج المضاعف التسعة، فاطرح منه تسعة، وهو ما يعادل جمع رقمي الناتج معا.
- اجمع كل القيم معا.
- احسب المقدار الذي تحتاج إلى إضافته للوصول إلى المضاعف التالي للعشرة. هذا المقدار هو رقم التحقق.
مثال قصير يجعل الفكرة ملموسة. خذ الأرقام 1 و 2 و 3 و 4 و 5 كجسم لرقم أطول، ورقمها من اليمين: يقف الرقم 5 في الموقع الأول، والرقم 4 في الموقع الثاني، والرقم 3 في الموقع الثالث، والرقم 2 في الموقع الرابع، والرقم 1 في الموقع الخامس. ومضاعفة المواقع الزوجية تحول الرقم 4 إلى 8 والرقم 2 إلى 4. فتصبح القيم 1 و 4 و 3 و 8 و 5، ومجموعها واحد وعشرون. والمضاعف التالي للعشرة هو ثلاثون، فيكون رقم التحقق تسعة، وتنتهي السلسلة النهائية بالرقم 9.
إنجاز ذلك يدويا لرقم بطاقة كامل أمر ممل لكنه لا يلتبس أبدا. والبرمجيات تفعله بالسير في السلسلة من نهايتها، ولهذا أيضا فإن أي تطبيق يبدأ من الجهة الخطأ سيرفض أرقاما سليمة تماما.
لماذا يكشف المضاعفة الأرقام المتبادلة؟
قاعدة المضاعفة ليست اعتباطية. إنها تجعل وزن كل رقم معتمدا على موقعه، فتبديل جارين يغير المجموع في الغالب.
وهذا مهم لأن أكثر خطأين بشريين شيوعا في حقل رقمي هما كتابة رقم واحد بشكل خاطئ، وتبديل رقمين متجاورين. فالرقم الواحد الخاطئ يزيح المجموع بمقدار غير صفري، فيفشل مجموع التحقق في معظم الحالات. وتبديل الجارين يزيح المجموع أيضا، لأن أحد الرقمين كان مضاعفا والآخر لم يكن.
في معظم الحالات، لا في كلها. فبعض التبادلات لا ترى بهذا الفحص. والنقطة العمياء الكلاسيكية هي الزوج المكون من الصفر والتسعة المتجاورين: مضاعفة التسعة ثم إنقاص تسعة من الناتج تعيد التسعة، فيمكن لهذين الرقمين أن يتبادلا موقعهما دون تغيير المجموع. وأزواج أخرى تتصرف بالطريقة نفسها. فالوصف الدقيق للفحص إذن أنه يكشف كل خطأ في رقم واحد ومعظم التبادلات المتجاورة، لا كلها.
ما الذي لا يستطيع رقم التحقق إخبارك به
لا يستطيع أن يقول إن الرقم حقيقي. فلا شيء في الحساب يشير إلى مصدر، فيمكن وصل أي بادئة بأي أرقام وسطى وحساب رقم ختامي صحيح ليوافقها.
ولا يستطيع أن يقول إن الحساب مفتوح، أو أن البطاقة لم تلغ، أو أن الشخص الذي يكتب الرقم يحمل البطاقة. كل سؤال من هذه الأسئلة يحتاج طلب تفويض إلى المصدر، وهو بالضبط العملية التي يجب أن تتجنبها بيئة الاختبار.
ولا يستطيع كذلك أن يضمن تاريخ الانتهاء ولا اسم حامل البطاقة ولا رمز الأمان. فهذه الحقول تقف بجانب رقم التحقق بقواعد خاصة بها، وقد يقترن رقم يحقق مجموع التحقق بتاريخ مضى وبرمز لا يطابق شيئا.
هذا هو الوصف الصادق لما تعيده الأداة على هذا الموقع: كل قيمة صحيحة بنيويا ومتسقة مع هذا المجموع، وكل واحدة منها رقم لم يصدر إلى أي شخص قط.
أين يظهر المجموع نفسه في مواضع أخرى
بطاقات الدفع هي أشهر مستخدم لهذه الطريقة، لكنها ليست الوحيدة. فأنظمة الترقيم التي تحتاج إلى حارس أخطاء رخيص تلجأ غالبا إلى الحساب العام نفسه، ومنها عدة أرقام هوية وطنية، وأنظمة نقاط ولاء وبطاقات هدايا متنوعة، ومعرفات داخلية مختلفة.
ولإعادة الاستخدام هذه نتيجة عملية. فالدالة المساعدة التي تعتبر اجتياز مجموع التحقق دليلا على أن المدخل بطاقة ائتمان ستصنف خطأ كل شيء آخر يصادف أنه يحقق المجموع. سم الروتين بحسب ما يفعله، أي مجموع تحقق بمعامل عشرة، لا بحسب المجال الذي لقيته فيه أول مرة.
للمطورين: ترتيب الفحوص والمزالق الشائعة
ترتيب التحقق يهم أكثر مما يتوقع الناس، ومجموع التحقق ليس المكان الصحيح للبدء منه.
افحص الطول أولا، لأن الإجراء لا رأي له في عدد الأرقام التي تسلم إليه؛ فجزء من خمسة أرقام يمكن أن يكون متسقا مع المجموع ويبقى عديم الفائدة. ثم افحص مجموعة المحارف، حتى ترفض الحروف والفراغات والفواصل الشاردة قبل تشغيل أي حساب. واحسب المجموع بعد ذلك، وبعدها فقط حاول التعرف على الشبكة من البادئة.
وتظهر ثلاث مزالق مرة تلو مرة:
- اعتبار الصفر الأولي غير ذي معنى. أرقام البطاقات سلاسل نصية لا أعداد صحيحة، والتحويل الرقمي قد يسقط رقما بصمت، فينتج فشل في المجموع لا علاقة له بما كتبه المستخدم.
- تشغيل جولة المضاعفة من اليسار. الموقع معرف من اليمين، فالاتجاه جزء من المواصفة لا تفصيل تنفيذي.
- الإبلاغ عن فشل المجموع كبطاقة مرفوضة. المعنى إدخال مشوه، وينبغي أن تقول الرسالة المعروضة للمستخدم ذلك.
ولبيانات الاختبار، النمط المفيد هو حفظ الأزواج: رقم يجتاز الفحص، والرقم نفسه مع تغيير رقم واحد فيه ليفشل. فذلك يمنح المجموعة حالة موجبة وحالة سالبة يفصلهما محرف واحد، فيبدو الانحدار واضحا من نظرة واحدة. ويغطي دليل التنسيق قواعد الطول والبادئة التي يجب أن تعمل قبل المجموع، ويجمع شرح التحقق في الكود التسلسل كاملا بترتيبه.
فحص مجموع تحقق مقابل سلسلة حقيقية
أسرع طريقة لبناء الحس بالمسألة هي تمرير بضع سلاسل عبر أداة إنشاء رقم البطاقة. أنشئ دفعة، وغير رقما واحدا بيدك وراقب فشل الفحص؛ ثم أنشئ مرة أخرى ولاحظ أن الرقم الختامي وحده يتحرك بينما يبقى كل ما قبله ثابتا. وتستحق مقارنة الشبكات قراءة تالية، لأن الحساب نفسه يتصرف بشكل مختلف بين أنظمة بطول مختلف، وهذا الفرق يربك الدوال المكتوبة يدويا.
الخطوات التالية
اكتب ترتيب التحقق قبل أن تكتب الكود، ويكون المجموع قبل الأخير فيه، واحفظ نموذجا مشوها عن قصد مقابل كل رقم صحيح في مجموعتك. وعندما تريد أن ترى كيف يتفاعل الطول مع البادئة مع الرقم الختامي، تابع بـتنسيق رقم البطاقة.