
استكمالاً لكلامنا عن أساسيات ال Fintech هنتكلم النهارده عن خوارزمية لوهن (Luhn Algorithm) أو Mod 10 Algorithm وهي خوارزمية رياضية بسيطة طورها العالم الألماني “هانز لوهن”في الخمسينات، وبنستخدمها بشكل كبير في أنظمة التحقق من صحة أرقام البطاقات البنكية زي ال Debit/Credit
الهدف الأساسي من الخوارزمية دي هو اكتشاف الأخطاء البسيطة اللي ممكن تحصل وأنت بتدخل رقم البطاقة، زي كتابة رقم غلط أو تبديل رقمين. ومش بيقتصر استخدامها بس في عالم ال Fintech ولكن كثير من الجهات الحكومية ممكن تستخدمها في التحقق من الأرقام الرسمية اللي بتصدرها للبطاقات والمستندات.
الخوارزمية مش مصممة علشان تمنع الاحتيال، لكن دورها الأساسي هو التأكد إن الرقم المُدخل متوافق مع قواعد تكوين أرقام البطاقات، وده بيساعد كتير في التحقق المبدئي وبنقوم بتنبيه المستخدم في ال Frontend عشان يصلح الرقم قبل إرسال البيانات لل Payment Processor. طبعًا الاكتشاف المبكر للخطأ بيوفر علينا Processing Costs وبيوفر علينا Requests رايحة جاية.
خطوات خوارزمية Luhn:
- ابدأ من الرقم الأخير على اليمين (أقصى اليمين).
- كل رقم في موقع فردي (من اليمين) سيبه زى ما هو.
- كل رقم في موقع زوجي (من اليمين) ضاعفه.
- لو الرقم الناتج من التضعيف أكبر من 9، اجمع الرقمين (مثال: 7 × 2 = 14 → 1 + 4 = 5).
- اجمع كل الأرقام الناتجة مع بعض.
- لو المجموع النهائي بيقبل القسمة على 10 بدون باقي، يبقى رقم البطاقة صحيح.
تنفيذ الخوارزمية كود سهل و أغلب الوقت بنستخدمها في ال Frontend عشان تدينا Real-time feedback عن صحة الرقم, ولكن يمكن استخدامها أيضًا في ال Backend كخطوة تحقق إضافية
مثال على تطبيق الخوارزمية باستخدام لغات برمجة مختلفة
function isValidCardNumber(cardNumber) {
// إزالة أي مسافات من الرقم
const sanitized = cardNumber.replace(/\s+/g, '');
let sum = 0;
let shouldDouble = false;
// نبدأ من آخر رقم ونتجه لليسار
for (let i = sanitized.length - 1; i >= 0; i--) {
let digit = parseInt(sanitized[i]);
if (shouldDouble) {
digit *= 2;
if (digit > 9) digit -= 9;
}
sum += digit;
shouldDouble = !shouldDouble;
}
// إذا كان المجموع يقبل القسمة على 10 → الرقم صحيح
return sum % 10 === 0;
}
// أمثلة للاختبار:
console.log(isValidCardNumber("4111 1111 1111 1111")); // true
console.log(isValidCardNumber("1234 5678 9012 3456")); // false
في الختام
الجدير بالذكر إن الخوارزمية زي ما قولنا ليها Limitations فهي تقدر تقول إن تسلسل معين من الأرقام صحيح ولكن مش بالضرورة يكون رقم بطاقة صالح لأنها بتعتمد إنها تكشف عن تبديل رقمين بالغلط لكن لو بدلت أكثر من رقم ورا بعض فممكن التبديل دا ينتج عنه رقم صحيح بالنهاية. نشوفكم في ورقة جديدة باذن الله سلام 👋