لوہن الگورڈم کا استعمال کرتے ہوئے نمبروں کی تصدیق اور پیدا کریں، جو عام طور پر کریڈٹ کارڈ نمبروں، کینیڈین سوشل انشورنس نمبروں، اور دیگر شناختی نمبروں کے لیے استعمال ہوتا ہے۔ جانچ کریں کہ آیا کوئی نمبر لوہن چیک پاس کرتا ہے یا ایسے درست نمبر پیدا کریں جو الگورڈم کے مطابق ہوں۔
Luhn الگورڈم، جسے "modulus 10" یا "mod 10" الگورڈم بھی کہا جاتا ہے، ایک سادہ چیک سم فارمولہ ہے جو مختلف شناختی نمبروں کی توثیق کے لیے استعمال ہوتا ہے، جیسے کہ کریڈٹ کارڈ نمبر، کینیڈا کے سوشل انشورنس نمبر، IMEI نمبر، اور ریاستہائے متحدہ میں قومی فراہم کنندہ کی شناخت کے نمبر۔ یہ کیلکولیٹر آپ کو Luhn الگورڈم کا استعمال کرتے ہوئے نمبروں کی توثیق کرنے اور درست نمبروں کی پیداوار کرنے کی اجازت دیتا ہے جو Luhn چیک پاس کرتے ہیں۔
Luhn الگورڈم اس طرح کام کرتا ہے:
یہاں Luhn الگورڈم کی بصری نمائندگی ہے:
Luhn الگورڈم کو ریاضیاتی طور پر اس طرح بیان کیا جا سکتا ہے:
فرض کریں کہ -واں عدد ہے، دائیں سے آخری عدد (چیک ڈیجیٹ کو چھوڑ کر) سے شروع کرتے ہوئے اور بائیں کی طرف بڑھتے ہوئے۔ پھر چیک ڈیجیٹ اس طرح منتخب کیا جاتا ہے کہ:
جہاں ماڈیولو عمل ہے۔
Luhn الگورڈم کے مختلف شعبوں میں مختلف ایپلی کیشنز ہیں:
اگرچہ Luhn الگورڈم وسیع پیمانے پر استعمال ہوتا ہے، لیکن مختلف مقاصد کے لیے دوسرے چیک سم الگورڈمز بھی ہیں:
Luhn الگورڈم کو ہانس پیٹر لuhn نے 1954 میں بنایا تھا، جو ایک IBM کمپیوٹر سائنسدان ہیں۔ Luhn معلوماتی سائنس کے میدان میں ایک پیشرو تھے اور انہیں کئی اختراعات کا سہرا دیا جاتا ہے، بشمول KWIC (کی ورڈ ان کنٹیکسٹ) انڈیکسنگ سسٹم۔
یہ الگورڈم دراصل حادثاتی غلطیوں کے خلاف تحفظ کے لیے ڈیزائن کیا گیا تھا، نہ کہ بدنیتی پر مبنی حملوں کے خلاف۔ یہ نوٹ کرنا ضروری ہے کہ اگرچہ Luhn الگورڈم بہت سی عام غلطیوں کا پتہ لگا سکتا ہے، یہ ڈیٹا سیکیورٹی کے مقاصد کے لیے ایک محفوظ شکل نہیں ہے اور اس پر انحصار نہیں کیا جانا چاہیے۔
اپنی عمر کے باوجود، Luhn الگورڈم اپنی سادگی اور عام نقل کی غلطیوں کو پکڑنے کی مؤثریت کی وجہ سے وسیع پیمانے پر استعمال ہوتا ہے۔
یہاں مختلف پروگرامنگ زبانوں میں Luhn الگورڈم کو نافذ کرنے کے کچھ کوڈ کی مثالیں ہیں:
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)) # درست 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)); // درست 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)); // درست 16-عدد نمبر پیدا کرتا ہے
47 }
48}
49
Luhn الگورڈم کو نافذ کرتے وقت، درج ذیل سرحدی کیسز اور خاص غور و فکر پر غور کریں:
ان پٹ کی توثیق: یہ یقینی بنائیں کہ ان پٹ ایک درست عددی سٹرنگ ہے۔ غیر عددی کرداروں کو مناسب طریقے سے سنبھالنا چاہیے (یا تو ہٹایا جائے یا غیر درست ان پٹ کے طور پر سمجھا جائے)۔
ابتدائی صفر: الگورڈم کو ان نمبروں کے ساتھ صحیح طور پر کام کرنا چاہیے جن میں ابتدائی صفر ہیں۔
بڑے نمبر: بہت طویل نمبروں کو سنبھالنے کے لیے تیار رہیں جو کچھ پروگرامنگ زبانوں میں معیاری عددی اقسام کی صلاحیت سے تجاوز کر سکتے ہیں۔
خالی ان پٹ: یہ طے کریں کہ آپ کے نفاذ کو خالی سٹرنگز یا نل ان پٹس کے ساتھ کیسے نمٹنا چاہیے۔
غیر معیاری کردار کے سیٹ: کچھ ایپلی کیشنز میں، آپ کو ایسے نمبر مل سکتے ہیں جو معیاری 0-9 رینج سے باہر کے کرداروں کے ساتھ پیش کیے جاتے ہیں۔ طے کریں کہ ان کے ساتھ کیسے نمٹا جائے۔
کارکردگی کے مسائل: ایسی ایپلی کیشنز کے لیے جو بڑی تعداد میں ان پٹس کو تیزی سے توثیق کرنے کی ضرورت ہوتی ہیں، الگورڈم کے نفاذ کو بہتر بنانے پر غور کریں۔
درست کریڈٹ کارڈ نمبر:
غیر درست کریڈٹ کارڈ نمبر:
درست کینیڈا کا سوشل انشورنس نمبر:
غیر درست IMEI نمبر:
Luhn الگورڈم کے نفاذ کی تصدیق کے لیے، آپ درج ذیل ٹیسٹ کیسز کا استعمال کر سکتے ہیں:
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