fintech payment backend

Luhn Algorithm Explained

خوارزمية Luhn هي طريقة بسيطة للتحقق من صحة أرقام البطاقات زي بطاقات الائتمان. بتشتغل عن طريق حساب Checksum وتتأكد إن الرقم صالح أو لأ. في الدليل ده هنعرف إزاي بتشتغل وليه بتستخدم، مع مثال عملي للتوضيح.

تم التحديث في 2025-08-19
تعديل على GitHub
Luhn Algorithm Explained

استكمالاً لكلامنا عن أساسيات ال Fintech هنتكلم النهارده عن خوارزمية لوهن (Luhn Algorithm) أو Mod 10 Algorithm وهي خوارزمية رياضية بسيطة طورها العالم الألماني “هانز لوهن”في الخمسينات، وبنستخدمها بشكل كبير في أنظمة التحقق من صحة أرقام البطاقات البنكية زي ال Debit/Credit 


الهدف الأساسي من الخوارزمية دي هو اكتشاف الأخطاء البسيطة اللي ممكن تحصل وأنت بتدخل رقم البطاقة، زي كتابة رقم غلط أو تبديل رقمين. ومش بيقتصر استخدامها بس في عالم ال Fintech ولكن كثير من الجهات الحكومية ممكن تستخدمها في التحقق من الأرقام الرسمية اللي بتصدرها للبطاقات والمستندات.

الخوارزمية مش مصممة علشان تمنع الاحتيال، لكن دورها الأساسي هو التأكد إن الرقم المُدخل متوافق مع قواعد تكوين أرقام البطاقات، وده بيساعد كتير في التحقق المبدئي وبنقوم بتنبيه المستخدم في ال Frontend عشان يصلح الرقم قبل إرسال البيانات لل Payment Processor. طبعًا الاكتشاف المبكر للخطأ بيوفر علينا Processing Costs وبيوفر علينا Requests رايحة جاية. 

خطوات خوارزمية Luhn:

  1. ابدأ من الرقم الأخير على اليمين (أقصى اليمين).
  2. كل رقم في موقع فردي (من اليمين) سيبه زى ما هو.
  3. كل رقم في موقع زوجي (من اليمين) ضاعفه.
  4. لو الرقم الناتج من التضعيف أكبر من 9، اجمع الرقمين (مثال: 7 × 2 = 14 → 1 + 4 = 5).
  5. اجمع كل الأرقام الناتجة مع بعض.
  6. لو المجموع النهائي بيقبل القسمة على 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 فهي تقدر تقول إن تسلسل معين من الأرقام صحيح ولكن مش بالضرورة يكون رقم بطاقة صالح لأنها بتعتمد إنها تكشف عن تبديل رقمين بالغلط لكن لو بدلت أكثر من رقم ورا بعض فممكن التبديل دا ينتج عنه رقم صحيح بالنهاية. نشوفكم في ورقة جديدة باذن الله سلام 👋


مواضيع ذات صلة
Payment & Fintech

اشترك في النشرة البريدية

احصل على أحدث المحتوى والأخبار مباشرة في بريدك الإلكتروني

🔒 نحترم خصوصيتك. لن نشارك بريدك الإلكتروني مع أي طرف ثالث.