خوارزمية لوهن هي صيغة مجموع اختبار بسيطة تُستخدم للتحقق من صحة أرقام التعريف المختلفة، بما في ذلك أرقام بطاقات الائتمان وأرقام IMEI. إنها أداة قيّمة للحفاظ على سلامة البيانات والكشف عن الأخطاء أثناء الإدخال. تستعرض هذه المقالة عمليات تنفيذ مختلفة بخوارزمية لوهن في بايثون، تعرض أنماط البرمجة المختلفة وكفاءتها النسبية.
محتويات
التنفيذ الأساسي
تتضمن خوارزمية لوهن هذه الخطوات:
- ضاعف كل رقم ثاني من اليمين إلى اليسار.
- إذا تجاوزت القيمة المضاعفة 9، اطرح 9.
- اجمع جميع الأرقام.
- إذا كان مجموع الباقي عند القسمة على 10 يساوي 0، فإن الرقم صحيح؛ خلاف ذلك، فهو غير صحيح.
فيما يلي تنفيذ بسيط في بايثون:
def luhn_check(number):
try:
digits = [int(d) for d in str(number)]
except ValueError:
return False
odd_sum = sum(digits[-1::-2])
even_sum = sum([sum(divmod(2 * d, 10)) for d in digits[-2::-2]])
return (odd_sum + even_sum) % 10 == 0
number1 = 49927398716
number2 = 1234567890123456
print(f"هل {number1} صحيح؟ {luhn_check(number1)}") # الإخراج: True
print(f"هل {number2} صحيح؟ {luhn_check(number2)}") # الإخراج: False
التفكيك الوظيفي
من أجل تحسين القابلية للقراءة والصيانة، يمكننا تقسيم الخوارزمية إلى وظائف أصغر وأكثر تركيزًا:
def double_digit(digit):
return sum(divmod(2 * digit, 10))
def sum_digits(digits):
return sum(digits)
def luhn_check_functional(number):
try:
digits = [int(d) for d in str(number)]
except ValueError:
return False
odd_sum = sum_digits(digits[-1::-2])
even_sum = sum_digits([double_digit(d) for d in digits[-2::-2]])
return (odd_sum + even_sum) % 10 == 0
print(f"هل {number1} صحيح (وظيفي)؟ {luhn_check_functional(number1)}") # الإخراج: True
print(f"هل {number2} صحيح (وظيفي)؟ {luhn_check_functional(number2)}") # الإخراج: False
النهج التكراري (الحلقات المتداخلة)
يوفر النهج التكراري باستخدام الحلقات المتداخلة، على الرغم من أنه أقل كفاءة، توضيحًا واضحًا خطوة بخطوة للخوارزمية (بشكل أساسي لأغراض تعليمية):
def luhn_check_iterative(number):
try:
digits = [int(x) for x in str(number)]
except ValueError:
return False
total = 0
for i in range(len(digits) - 1, -1, -1):
if i % 2 == 0:
total += digits[i]
else:
doubled = digits[i] * 2
if doubled > 9:
doubled -= 9
total += doubled
return total % 10 == 0
print(f"هل {number1} صحيح (تكراري)؟ {luhn_check_iterative(number1)}") # الإخراج: True
print(f"هل {number2} صحيح (تكراري)؟ {luhn_check_iterative(number2)}") # الإخراج: False
برمجة وظيفية متقدمة
يعزز استخدام دالتي map
و reduce
في بايثون النهج الوظيفي بشكل أكبر:
from functools import reduce
def luhn_check_fp(number):
try:
digits = list(map(int, str(number)))
except ValueError:
return False
odd_sum = sum(digits[-1::-2])
even_sum = reduce(lambda x, y: x + y, map(lambda d: sum(divmod(2 * d, 10)), digits[-2::-2]))
return (odd_sum + even_sum) % 10 == 0
print(f"هل {number1} صحيح (برمجة وظيفية)؟ {luhn_check_fp(number1)}") # الإخراج: True
print(f"هل {number2} صحيح (برمجة وظيفية)؟ {luhn_check_fp(number2)}") # الإخراج: False
الخلاصة
قدمت هذه المقالة عمليات تنفيذ مختلفة بخوارزمية لوهن في بايثون، تُظهر نماذج برمجة مختلفة. بينما يساعد النهج التكراري على الفهم، فإن النهج الوظيفي، وخاصة النهج المتقدم، يوفر قابلية أفضل للقراءة والكفاءة للتطبيقات العملية. تذكر أن خوارزمية لوهن هي مجموع اختبار، وليست حلًا أمنيًا كاملاً؛ يجب استخدامها مع طرق التحقق الأخرى.