Validējiet un ģenerējiet skaitļus, izmantojot Luhna algoritmu, kas parasti tiek izmantots kredītkartēm, Kanādas sociālās apdrošināšanas numuriem un citiem identifikācijas numuriem. Pārbaudiet, vai skaitlis iztur Luhna pārbaudi, vai ģenerējiet derīgus skaitļus, kas atbilst algoritmam.
Luhn algoritms, pazīstams arī kā "modulus 10" vai "mod 10" algoritms, ir vienkārša kontrolsumma, ko izmanto, lai validētu dažādas identifikācijas numurus, piemēram, kredītkaršu numurus, Kanādas sociālās apdrošināšanas numurus, IMEI numurus un Nacionālo pakalpojumu identifikatoru numurus Amerikas Savienotajās Valstīs. Šis kalkulators ļauj jums validēt numurus, izmantojot Luhn algoritmu, un ģenerēt derīgus numurus, kas iztur Luhn pārbaudi.
Luhn algoritms darbojas šādi:
Šeit ir vizuāls Luhn algoritma attēlojums:
Luhn algoritmu var izteikt matemātiski šādi:
Lai būtu -tais cipars, skaitot no labējā malējā cipara (izņemot kontrolciparu) un virzoties pa kreisi. Tad kontrolcipars tiek izvēlēts tā, lai:
Kur ir modulo operācija.
Luhn algoritmam ir dažādas pielietošanas jomas dažādās nozarēs:
Lai gan Luhn algoritms ir plaši izmantots, ir arī citi kontrolciparu algoritmi dažādiem mērķiem:
Luhn algoritmu izveidoja Hanss Pēters Luhns, IBM datorzinātnieks, 1954. gadā. Luhns bija informācijas zinātnes jomas pionieris un ir kredīts vairākiem jauninājumiem, tostarp KWIC (Key Word In Context) indeksēšanas sistēmai.
Algoritms sākotnēji tika izstrādāts, lai pasargātu no nejaušām kļūdām, nevis ļaunprātīgiem uzbrukumiem. Ir svarīgi atzīmēt, ka, lai gan Luhn algoritms var atklāt daudzus izplatītus kļūdu gadījumus, tas nav droša šifrēšanas forma un to nedrīkst izmantot datu drošības nolūkiem.
Neskatoties uz savu vecumu, Luhn algoritms joprojām ir plaši izmantots, pateicoties tā vienkāršībai un efektivitātei, atklājot izplatītas transkripcijas kļūdas.
Šeit ir daži koda piemēri, kā ieviest Luhn algoritmu dažādās programmēšanas valodās:
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## Piemēra izmantošana:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Ģenerē derīgu 16 ciparu numuru
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// Piemēra izmantošana:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Ģenerē derīgu 16 ciparu numuru
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)); // Ģenerē derīgu 16 ciparu numuru
47 }
48}
49
Izmantojot Luhn algoritmu, ņemiet vērā šādus malu gadījumus un īpašas apsvērumus:
Ievades validācija: Pārliecinieties, ka ievade ir derīgs ciparu virkne. Ne-ciparu rakstzīmes jāapstrādā atbilstoši (vai nu jānoņem, vai arī jāuzskata par nederīgu ievadi).
Vadošie nulles: Algoritmam vajadzētu pareizi darboties ar numuriem, kuriem ir vadošās nulles.
Lieli numuri: Esiet gatavi apstrādāt ļoti garus numurus, kas var pārsniegt dažās programmēšanas valodās standarta veselo skaitļu tipu jaudu.
Tukša ievade: Definējiet, kā jūsu ieviešana rīkosies ar tukšām virknēm vai nulles ievadēm.
Ne-standarta rakstzīmju kopas: Dažās lietojumprogrammās jūs varat sastapt numurus, kas attēloti ar rakstzīmēm ārpus standarta 0-9 diapazona. Definējiet, kā šos jāapstrādā.
Veiktspējas apsvērumi: Lietojumprogrammām, kas ātri jāvalidē liels skaits ievades, apsveriet algoritma ieviešanas optimizāciju.
Derīgs kredītkaršu numurs:
Nederīgs kredītkaršu numurs:
Derīgs Kanādas sociālās apdrošināšanas numurs:
Nederīgs IMEI numurs:
Lai pārbaudītu Luhn algoritma ieviešanu, varat izmantot šādus testa gadījumus:
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 # Testa ģenerētie numuri
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Visi testi izturēti!")
12
13test_luhn_algorithm()
14