خوارزمية لوهن
- مبادئ خوارزمية لوهن
- كود خوارزمية لوهن
في هذا المقال سنتعرف على خوارزمية لوهن ( Luhn Algorithm ) التي تستخدم للتحقق من صحة رقم بطاقة المصرف الإلكترونية.
يمكنك الإستفادة من هذه الخوارزمية في حال أردت جعل المستخدم يدخل رقم بطاقته المصرفية و قبولها فقط في حال كانت الأرقام التي أدخلها مطابقة لمعايير أرقام بطاقات المصارف. كما يمكنك الإستفادة منها في حال كنت تريد توليد أرقام بطاقات في مشروعك بهدف التجربة.
مبادئ خوارزمية لوهن
سنشرح مبادئ خوارزمية لوهن بالتفصيل من خلال مثال عملي نقوم فيه باختبار أرقام بطاقة صحيحة هي 5560593098175339
.
1- قم بتعداد أرقام البطاقة من 0 إلى 15.
التعداد أو الموقع الخاص بكل رقم يسمى index و يبدأ من اليسار إلى اليمين كالتالي.
2- قم بجمع الأرقام التي يكون التعداد الخاص بها مفرد ( Odd ) كالتالي.
مجموع هذه الأرقام هو 41.
3- قم بضرب الرقم الذي يكون التعداد الخاص به زوجي ( Even ) برقم 2 و إذا كان الناتج أقل من 10 أبيه كما هو و إذا كان يساوي أو أكبر من 10 إطرح منه 9 و من ثم إجمع كل النواتج.
المجموع لهذه الارقام هو 29.
4- الآن قم بجمع المجموعين السابقين و انظر إن كان الناتج يقبل القسمة على 10 أم لا.
- في حال كان الناتج يقبل القسمة فهذا يعني أن أرقام البطاقة هي أرقام صحيحة.
- إن كان لا يقبل فهذا يعني أن أرقام البطاقة ليست صحيحة.
معلومة: لمعرفة ما إن كان الناتج يقبل القسمة على 10 أم لا فإننا برمجياً نستخدم العامل %
لنحصل على الرقم المتبقي من عملية القسمة ( Reminder ). و في حال كان الرقم المتبقي من عملية القسمة هو صفر فهذا يعني أن العدد يقبل القسمة على 10.
الآن إذا قمنا بحساب مجموع المجموعين السابقين و قسمناه على 10 فالناتج سيكون صفر مما يعني أن أرقام البطاقة صحيحة.
كود خوارزمية لوهن
ليس هناك كود محدد لتطبيق هذه الخوارزمية و يمكنك تطبيقها برمجياً بالطريقة التي تريدها طالما أنك تتطبق مبادئها بشكل صحيح.
في المثال التالي قمنا ببناء دالة إسمها check_card()
يمكنك استخدامها لاختبار رقم أي بطاقة تمرره له.
بعدها قمنا بتجربة الدالة على الرقم 5560593098175339
و طباعة ما إن كان الرقم صحيح أم لا.
def check_card(card): """ Credit Card Test """ if len(card) != 16 : return False app_comma = ",".join(card).split(",") card_list = [int(i) for i in app_comma] sum_index_odd , sum_index_even = 0 , 0 check_number_even = [] for index in range(len(card_list)-1,-1,-1): if (index % 2 == 1): sum_index_odd += card_list[index] else: check_number_even.append(card_list[index]) res_even = [i * 2 for i in check_number_even] for element_even in res_even : if element_even >= 10 : element_even = (element_even - 9) sum_index_even += element_even total_sum = sum_index_odd + sum_index_even return total_sum % 10 == 0 # 5560593098175339 على رقم البطاقة check_card() هنا قمنا باختبار الدالة if __name__=="__main__": card = "5560593098175339" is_valid = check_card(card) if (is_valid): print("valid card") else: print("Invalid card!")
شرح خورازمية لوهن
في الفيديو التالي قمنا بشرح طريقة عمل الكود خطوة خطوة.