Luhni algoritmi kalkulaator
Luhn'i algoritmi kalkulaator
Sissejuhatus
Luhn'i algoritm, tuntud ka kui "modulus 10" või "mod 10" algoritm, on lihtne kontrollsumma valem, mida kasutatakse erinevate identifitseerimisnumberite valideerimiseks, nagu krediitkaardi numbrid, Kanada sotsiaalkindlustuse numbrid, IMEI numbrid ja riiklikud pakkuja identifikaatori numbrid Ameerika Ühendriikides. See kalkulaator võimaldab teil valideerida numbreid Luhn'i algoritmi abil ja genereerida kehtivaid numbreid, mis läbivad Luhn'i kontrolli.
Kuidas Luhn'i algoritm töötab
Luhn'i algoritm töötab järgmiselt:
- Alustades parempoolsest numbrist (ilma kontrollnumbrita) ja liikudes vasakule, kahekordista iga teise numbri väärtus.
- Kui selle kahekordistamise tulemuseks on rohkem kui 9, lahuta 9 tulemusele.
- Summeerige kõik numbrid saadud järjestuses.
- Kui summa modulo 10 on võrdne 0 (kui summa lõpeb nulliga), siis on number Luhn'i valemi kohaselt kehtiv; vastasel juhul ei ole see kehtiv.
Siin on visuaalne esitus Luhn'i algoritmist:
Valem
Luhn'i algoritmi saab matemaatiliselt väljendada järgmiselt:
Olgu -ne number, loendades paremalt (ilma kontrollnumbrita) ja liikudes vasakule. Siis valitakse kontrollnumber nii, et:
Kus on modulo operatsioon.
Kasutusalad
Luhn'i algoritmil on erinevaid rakendusi erinevates valdkondades:
- Krediitkaardi valideerimine: Enamik krediitkaardi numbreid valideeritakse Luhn'i algoritmi abil.
- Kanada sotsiaalkindlustuse numbrid: Luhn'i algoritmi kasutatakse nende identifitseerimisnumberite kehtivuse kontrollimiseks.
- IMEI numbrid: Mobiiltelefonide IMEI numbrid sisaldavad kontrollnumbrit, mille valideerib Luhn'i algoritm.
- Riiklikud pakkuja identifikaatori (NPI) numbrid: Ameerika Ühendriikide tervishoiusüsteemis kasutatakse neid numbreid Luhn'i algoritmi abil valideerimiseks.
- ISBN-id: Mõned ISBN-10 numbrid kasutavad valideerimiseks Luhn'i algoritmi varianti.
Alternatiivid
Kuigi Luhn'i algoritm on laialdaselt kasutusel, on olemas ka teisi kontrollsumma algoritme erinevateks eesmärkideks:
- Damm'i algoritm: Teine kontrollnumbrite algoritm, mis tuvastab kõik ühekohalised vead ja kõik külgnevate vahetuste vead.
- Verhoeff'i algoritm: Kompleksem kontrollsumma algoritm, mis tuvastab kõik ühekohalised vead ja enamik vahetusvigu.
- ISBN-13 kontrollnumber: Kasutab erinevat algoritmi kui ISBN-10, mis põhineb Luhn'i algoritmil.
Ajalugu
Luhn'i algoritmi lõi Hans Peter Luhn, IBM-i arvutiteadlane, 1954. aastal. Luhn oli teabe teaduse valdkonna pioneer ja talle kuulub mitmeid uuendusi, sealhulgas KWIC (Key Word In Context) indekseerimissüsteem.
Algoritm loodi algselt, et kaitsta juhuslike vigade eest, mitte pahatahtlike rünnakute eest. Oluline on märkida, et kuigi Luhn'i algoritm suudab tuvastada paljusid tavalisi vigu, ei ole see turvaline krüpteerimise vorm ja sellele ei tohiks toetuda andmete turvalisuse eesmärkidel.
Oma vanusest hoolimata jääb Luhn'i algoritm laialdaselt kasutusele oma lihtsuse ja efektiivsuse tõttu tavaliste transkriptsioonivigade tuvastamisel.
Rakendamise näited
Siin on mõned koodinäited Luhn'i algoritmi rakendamiseks erinevates programmeerimiskeeltes:
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])))
## Näide kasutamisest:
print(luhn_validate(4532015112830366)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # Genereerib kehtiva 16-kohalise numbri
Äärmuslikud juhtumid ja erilised kaalutlused
Luhn'i algoritmi rakendamisel arvestage järgmiste äärmuslike juhtumite ja eriküsimustega:
-
Sisendi valideerimine: Veenduge, et sisend on kehtiv numbrirea. Mitte-numbrilised sümbolid tuleks käsitleda sobivalt (kas eemaldada või käsitleda kehtetuna).
-
Esialgsed nullid: Algoritm peaks õigesti töötama numbritega, millel on esialgsed nullid.
-
Suured numbrid: Olge valmis käsitlema väga pikki numbreid, mis võivad ületada mõnede programmeerimiskeelte standardsete täisarvutüüpide võimekuse.
-
Tühi sisend: Määratlege, kuidas teie rakendus peaks käsitlema tühje stringe või nullsisendeid.
-
Mitte-standardsete sümbolite kogumid: Mõnes rakenduses võite kokku puutuda numbritega, mis on esitatud sümbolitega väljaspool standardset 0-9 vahemikku. Määratlege, kuidas nende suhtes käituda.
-
Tootlikkuse kaalutlused: Rakenduste puhul, mis peavad kiiresti valideerima suures koguses sisendeid, kaaluge algoritmi rakenduse optimeerimist.
Numbrilised näited
-
Kehtiv krediitkaardi number:
- Number: 4532015112830366
- Luhn'i kontroll: Kehtiv
-
Kehtetu krediitkaardi number:
- Number: 4532015112830367
- Luhn'i kontroll: Kehtetu
-
Kehtiv Kanada sotsiaalkindlustuse number:
- Number: 046 454 286
- Luhn'i kontroll: Kehtiv
-
Kehtetu IMEI number:
- Number: 490154203237518
- Luhn'i kontroll: Kehtetu
Testjuhtumid
Luhn'i algoritmi rakenduse kontrollimiseks võite kasutada järgmisi testjuhtumeid:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Testige genereeritud numbreid
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Kõik testid läbitud!")
test_luhn_algorithm()
Viidatud allikad
- Luhn, H. P. (1960). "Arvuti numbrite kontrollimiseks". USA patent 2,950,048.
- Gallian, Joseph. "Identifitseerimisnumberite matemaatika." College Mathematics Journal, vol. 22, nr. 3, 1991, lk. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". Rahvusvaheline standardiorganisatsioon. Juurdepääs 2. august 2024.
- Knuth, Donald. "Arvutitehnika kunst, köide 2: Seminumerilised algoritmid". Addison-Wesley, 1997.