Luhn algoritma kalkulators
Luhn algoritma kalkulators
Ievads
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.
Kā darbojas Luhn algoritms
Luhn algoritms darbojas šādi:
- Sākot no labējā malējā cipara (izņemot kontrolciparu) un virzoties pa kreisi, divkāršojiet katra otra cipara vērtību.
- Ja šī divkāršošanas operācija ir lielāka par 9, no rezultāta atņemiet 9.
- Saskaitiet visus ciparus iegūtajā secībā.
- Ja kopējā summa modulo 10 ir vienāda ar 0 (ja kopējā summa beidzas ar nulli), tad numurs ir derīgs saskaņā ar Luhn formulu; pretējā gadījumā tas nav derīgs.
Šeit ir vizuāls Luhn algoritma attēlojums:
Formula
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.
Lietošanas gadījumi
Luhn algoritmam ir dažādas pielietošanas jomas dažādās nozarēs:
- Kredītkaršu validācija: Lielākā daļa kredītkaršu numuru tiek validēti, izmantojot Luhn algoritmu.
- Kanādas sociālās apdrošināšanas numuri: Luhn algoritms tiek izmantots, lai pārbaudītu šo identifikācijas numuru derīgumu.
- IMEI numuri: Mobilā telefona IMEI numuri ietver kontrolciparu, ko validē Luhn algoritms.
- Nacionālo pakalpojumu identifikatora (NPI) numuri: Lietots ASV veselības aprūpes sistēmā, šie numuri tiek validēti, izmantojot Luhn algoritmu.
- ISBN: Daži ISBN-10 numuri izmanto Luhn algoritma variantu validācijai.
Alternatīvas
Lai gan Luhn algoritms ir plaši izmantots, ir arī citi kontrolciparu algoritmi dažādiem mērķiem:
- Damm algoritms: Vēl viens kontrolciparu algoritms, kas atklāj visas vienciparu kļūdas un visas blakus transpozīcijas kļūdas.
- Verhoeff algoritms: Sarežģītāks kontrolciparu algoritms, kas atklāj visas vienciparu kļūdas un lielāko daļu transpozīcijas kļūdu.
- ISBN-13 kontrolcipars: Izmanto citu algoritmu nekā ISBN-10, kas balstās uz Luhn algoritmu.
Vēsture
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.
Ieviešanas piemēri
Šeit ir daži koda piemēri, kā ieviest Luhn algoritmu dažādās programmēšanas valodās:
import random
def luhn_validate(number):
digits = [int(d) for d in str(number)]
checksum = 0
for i in range(len(digits) - 1, -1, -1):
d = digits[i]
if (len(digits) - i) % 2 == 0:
d = d * 2
if d > 9:
d -= 9
checksum += d
return checksum % 10 == 0
def generate_valid_number(length):
digits = [random.randint(0, 9) for _ in range(length - 1)]
checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
check_digit = (10 - (checksum % 10)) % 10
return int(''.join(map(str, digits + [check_digit])))
## Piemēra izmantošana:
print(luhn_validate(4532015112830366)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # Ģenerē derīgu 16 ciparu numuru
Malu gadījumi un īpašas apsvērumi
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.
Ciparu piemēri
-
Derīgs kredītkaršu numurs:
- Numurs: 4532015112830366
- Luhn pārbaude: Derīgs
-
Nederīgs kredītkaršu numurs:
- Numurs: 4532015112830367
- Luhn pārbaude: Nederīgs
-
Derīgs Kanādas sociālās apdrošināšanas numurs:
- Numurs: 046 454 286
- Luhn pārbaude: Derīgs
-
Nederīgs IMEI numurs:
- Numurs: 490154203237518
- Luhn pārbaude: Nederīgs
Testa gadījumi
Lai pārbaudītu Luhn algoritma ieviešanu, varat izmantot šādus testa gadījumus:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Testa ģenerētie numuri
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Visi testi izturēti!")
test_luhn_algorithm()
Atsauces
- Luhn, H. P. (1960). "Dators numuru pārbaudei". ASV patents 2,950,048.
- Gallian, Joseph. "Identifikācijas numuru matemātika." Koledžas matemātikas žurnāls, vol. 22, nr. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". Starptautiskā standartizācijas organizācija. Iegūts 2024. gada 2. augustā.
- Knuth, Donald. "Datoru programmēšanas māksla, 2. sējums: Seminumera algoritmi". Addison-Wesley, 1997.