اعتبارسنجی و تولید شمارهها با استفاده از الگوریتم لون، که بهطور معمول برای شمارههای کارت اعتباری، شمارههای بیمه اجتماعی کانادا و سایر شمارههای شناسایی استفاده میشود. بررسی کنید که آیا یک شماره از آزمایش لون عبور میکند یا شمارههای معتبری که با الگوریتم مطابقت دارند تولید کنید.
الگوریتم لون، که به عنوان "مدول ۱۰" یا "مد ۱۰" نیز شناخته میشود، یک فرمول ساده چکسوم است که برای اعتبارسنجی انواع شمارههای شناسایی، مانند شمارههای کارت اعتباری، شمارههای بیمه اجتماعی کانادا، شمارههای IMEI و شمارههای شناسنده ملی ارائهدهندگان در ایالات متحده استفاده میشود. این محاسبهگر به شما این امکان را میدهد که شمارهها را با استفاده از الگوریتم لون اعتبارسنجی کنید و شمارههای معتبری که از چک لون عبور میکنند، تولید کنید.
الگوریتم لون به شرح زیر عمل میکند:
در اینجا یک نمایش بصری از الگوریتم لون آورده شده است:
الگوریتم لون میتواند به صورت ریاضی به شرح زیر بیان شود:
بگذارید رقم -ام باشد، با شمارش از رقم راستترین (به جز رقم چک) و به سمت چپ حرکت کنید. سپس رقم چک به گونهای انتخاب میشود که:
که در آن عملگر ماژول است.
الگوریتم لون در زمینههای مختلف کاربردهای گوناگونی دارد:
در حالی که الگوریتم لون به طور گستردهای استفاده میشود، الگوریتمهای چکسوم دیگری نیز برای اهداف مختلف وجود دارد:
الگوریتم لون توسط هانس پتر لون، یک دانشمند کامپیوتر IBM، در سال ۱۹۵۴ ایجاد شد. لون پیشگام در زمینه علم اطلاعات بود و به خاطر چندین نوآوری، از جمله سیستم نمایهسازی KWIC (کلمه کلیدی در متن) شناخته میشود.
این الگوریتم در اصل برای محافظت در برابر خطاهای تصادفی طراحی شده بود، نه حملات مخرب. مهم است که توجه داشته باشید که در حالی که الگوریتم لون میتواند بسیاری از خطاهای رایج را شناسایی کند، این یک شکل امن از رمزنگاری نیست و نباید برای اهداف امنیت دادهها به آن اتکا شود.
با وجود سنش، الگوریتم لون به دلیل سادگی و کاراییاش در شناسایی خطاهای رایج به طور گستردهای استفاده میشود.
در اینجا برخی از مثالهای کد برای پیادهسازی الگوریتم لون در زبانهای برنامهنویسی مختلف آورده شده است:
1import random
2
3def luhn_validate(number):
4 digits = [int(d) for d in str(number)]
5 checksum = 0
6 for i in range(len(digits) - 1, -1, -1):
7 d = digits[i]
8 if (len(digits) - i) % 2 == 0:
9 d = d * 2
10 if d > 9:
11 d -= 9
12 checksum += d
13 return checksum % 10 == 0
14
15def generate_valid_number(length):
16 digits = [random.randint(0, 9) for _ in range(length - 1)]
17 checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
18 check_digit = (10 - (checksum % 10)) % 10
19 return int(''.join(map(str, digits + [check_digit])))
20
21## مثال استفاده:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # تولید یک شماره معتبر ۱۶ رقمی
25
1function luhnValidate(number) {
2 const digits = number.toString().split('').map(Number);
3 let checksum = 0;
4 for (let i = digits.length - 1; i >= 0; i--) {
5 let d = digits[i];
6 if ((digits.length - i) % 2 === 0) {
7 d *= 2;
8 if (d > 9) d -= 9;
9 }
10 checksum += d;
11 }
12 return checksum % 10 === 0;
13}
14
15function generateValidNumber(length) {
16 const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
17 const checksum = digits.reduce((sum, digit, index) => {
18 if ((length - 1 - index) % 2 === 0) {
19 digit *= 2;
20 if (digit > 9) digit -= 9;
21 }
22 return sum + digit;
23 }, 0);
24 const checkDigit = (10 - (checksum % 10)) % 10;
25 return parseInt(digits.join('') + checkDigit);
26}
27
28// مثال استفاده:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // تولید یک شماره معتبر ۱۶ رقمی
32
1import java.util.Random;
2
3public class LuhnValidator {
4 public static boolean luhnValidate(long number) {
5 String digits = String.valueOf(number);
6 int checksum = 0;
7 boolean isEven = true;
8 for (int i = digits.length() - 1; i >= 0; i--) {
9 int digit = Character.getNumericValue(digits.charAt(i));
10 if (isEven) {
11 digit *= 2;
12 if (digit > 9) digit -= 9;
13 }
14 checksum += digit;
15 isEven = !isEven;
16 }
17 return checksum % 10 == 0;
18 }
19
20 public static long generateValidNumber(int length) {
21 Random random = new Random();
22 long[] digits = new long[length - 1];
23 for (int i = 0; i < length - 1; i++) {
24 digits[i] = random.nextInt(10);
25 }
26 long checksum = 0;
27 for (int i = digits.length - 1; i >= 0; i--) {
28 long digit = digits[i];
29 if ((length - 1 - i) % 2 == 0) {
30 digit *= 2;
31 if (digit > 9) digit -= 9;
32 }
33 checksum += digit;
34 }
35 long checkDigit = (10 - (checksum % 10)) % 10;
36 long result = 0;
37 for (long digit : digits) {
38 result = result * 10 + digit;
39 }
40 return result * 10 + checkDigit;
41 }
42
43 public static void main(String[] args) {
44 System.out.println(luhnValidate(4532015112830366L)); // true
45 System.out.println(luhnValidate(4532015112830367L)); // false
46 System.out.println(generateValidNumber(16)); // تولید یک شماره معتبر ۱۶ رقمی
47 }
48}
49
هنگام پیادهسازی الگوریتم لون، به موارد حاشیهای و ملاحظات ویژه زیر توجه کنید:
اعتبارسنجی ورودی: اطمینان حاصل کنید که ورودی یک رشته عددی معتبر است. کاراکترهای غیر عددی باید به طور مناسب مدیریت شوند (یا حذف شوند یا به عنوان ورودی نامعتبر در نظر گرفته شوند).
صفرهای ابتدایی: الگوریتم باید به درستی با شمارههایی که دارای صفرهای ابتدایی هستند، کار کند.
شمارههای بزرگ: آماده باشید که شمارههای بسیار طولانی را که ممکن است از ظرفیت نوعهای استاندارد عددی در برخی زبانهای برنامهنویسی فراتر بروند، مدیریت کنید.
ورودی خالی: تعریف کنید که پیادهسازی شما باید چگونه با رشتههای خالی یا ورودیهای null برخورد کند.
مجموعههای کاراکتری غیر استاندارد: در برخی برنامهها، ممکن است با شمارههایی روبرو شوید که با کاراکترهایی خارج از محدوده استاندارد ۰-۹ نمایش داده میشوند. تعریف کنید که اینها چگونه باید مدیریت شوند.
ملاحظات عملکرد: برای برنامههایی که نیاز به اعتبارسنجی تعداد زیادی ورودی به سرعت دارند، به بهینهسازی پیادهسازی الگوریتم فکر کنید.
شماره معتبر کارت اعتباری:
شماره نامعتبر کارت اعتباری:
شماره معتبر بیمه اجتماعی کانادا:
شماره نامعتبر IMEI:
برای تأیید پیادهسازی الگوریتم لون، میتوانید از موارد آزمایشی زیر استفاده کنید:
1def test_luhn_algorithm():
2 assert luhn_validate(4532015112830366) == True
3 assert luhn_validate(4532015112830367) == False
4 assert luhn_validate(79927398713) == True
5 assert luhn_validate(79927398714) == False
6
7 # تست شمارههای تولید شده
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("تمام تستها با موفقیت گذرانده شد!")
12
13test_luhn_algorithm()
14