الگوریتم لان
From Wikipedia, the free encyclopedia
From Wikipedia, the free encyclopedia
الگوریتم لان یا فرمول لان، که به الگوریتم "پیمانه ۱۰" نیز مشهور است، یک فرمول ساده برای درستی یابی تعداد زیادی شماره شناسایی است، مانند شماره کارتهای اعتباری، شمارههای IMEI و شماره ملی. این روش توسط Hans Peter Luhn ابداع شد و در U.S. Patent No. ۲،۹۵۰،۰۴۸ توصیف شده. این الگوریتم به وفور استفاده میشود و به منظور یک تابع درهمساز رمزنگارانه استفاده نمیشود. در واقع این روش برای حفاظت در برابر خطاهای تصادفی میباشد نه حملات عمدی. بسیاری از شمارههای کارتهای اعتباری و شناسههای دولتی از این روش برای متمایز کردن شمارههای معتبر از هر جایگشت نا معتبری از اعداد استفاده میشود.
الگوریتم لان همه خطاهای تک رقمی را تشخیص میدهد، و همینطور جابجا شدن دو رقم کنار هم را. ولی جابجایی ۰۹ به ۹۰ و برعکس را نمیتواند تشخیص بدهد. و همینطور ۷ تا از ۱۰ تا خطای دوقلو را میتواند تشخیص دهد(این موارد را تشخیص نمیدهد: ۲۲ به ۵۵و ۳۳ به ۶۶ یا ۴۴ به ۷۷). الگوریتمهای پیچیده تر مانند الگوریتم Verhoeff می توانند خطاهای جابجایی بیشتری را تشخیص دهند. الگوریتم Luhn mod N تعمیم این الگوریتم برای رشتههای غیر عددی میباشد . به دلیل اینکه این الگوریتم به ترتیب راست به چپ روی ارقام عمل میکند و رقمهای صفر فقط در صورتی که باعث تغییر مکان شوند نتیجه را تغییر می دهند، اضافه کردن صفر به اول یک رشته عددی محاسبات را تغییر نمیدهد. بنابراین، اجرای الگوریتم لان قبل و بعد از اضافه کردن چند رقم صفر به اول رشته نتیجه یکسانی خواهد داشت.
این فرمول یک عدد را در برابر رقم تطبیق آن درستی یابی میکند، که عموماً به بک شماره حساب پاره ای به منظور تولید شماره حساب کامل اضافه میشود. این شماره حساب باید تست زیر را پاس کند:
Account number | ۷ | ۹ | ۹ | ۲ | ۷ | ۳ | ۹ | ۸ | ۷ | ۱ | x |
---|---|---|---|---|---|---|---|---|---|---|---|
Double every other | ۷ | ۱۸ | ۹ | ۴ | ۷ | ۶ | ۹ | ۱۶ | ۷ | ۲ | x |
Sum of digits | ۷ | ۹ | ۹ | ۴ | ۷ | ۶ | ۹ | ۷ | ۷ | ۲ | =۶۷ |
رقم تطبیق (x) بوسیلهٔ محاسبهٔ ضرب جمع ارقام در ۹ در پیمانه ۱۰ بدست می آید. به بیان Layman:
روش جایگزین: رقم تطبیق بوسیلهٔ محاسبه تفریق رقم اول مجموع ارقام از ۱۰ بدست می آید.
همهٔ این اعداد ۷۹۹۲۷۳۹۸۷۱۰، ۷۹۹۲۷۳۹۸۷۱۱، ۷۹۹۲۷۳۹۸۷۱۲، ۷۹۹۲۷۳۹۸۷۱۳، ۷۹۹۲۷۳۹۸۷۱۴، ۷۹۹۲۷۳۹۸۷۱۵، ۷۹۹۲۷۳۹۸۷۱۶، ۷۹۹۲۷۳۹۸۷۱۷، ۷۹۹۲۷۳۹۸۷۱۸، ۷۹۹۲۷۳۹۸۷۱۹ به صورت زیر درستی یابی میشوند.
در پایتون:
def is_luhn_valid(cc):
num = map(int, str(cc))
return sum(num[::-2] + [sum(divmod(d * 2, 10)) for d in num[-2::-2]]) % 10 == ۰
پیاده سازی بالا درستی یک شماره ورودی را با یک شماره تطبیق چک میکند. برای محاسبه رقم تطبیق تغییر کوچکی در پیادهسازی نیاز است:
در پایتون:
def calculate_luhn(cc):
num = list(map(int, str(cc)))
check_digit = 10 - sum(num[-2::-2] + [sum(divmod(d * 2, 10)) for d in num[::-2]]) % 10
return 0 if check_digit == 10 else check_digit
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.