Luhn Algoritme Calculator
Luhn Algoritme Calculator
Introductie
Het Luhn-algoritme, ook wel bekend als het "modulus 10" of "mod 10" algoritme, is een eenvoudige controleformule die wordt gebruikt om een verscheidenheid aan identificatienummers te valideren, zoals creditcardnummers, Canadese sociale verzekeringsnummers, IMEI-nummers en nationale zorgverlenersidentificatienummers in de Verenigde Staten. Deze calculator stelt je in staat om nummers te valideren met behulp van het Luhn-algoritme en geldige nummers te genereren die de Luhn-controle doorstaan.
Hoe het Luhn-algoritme werkt
Het Luhn-algoritme werkt als volgt:
- Begin vanaf het rechtercijfer (uitgezonderd het controlecijfer) en ga naar links, verdubbel de waarde van elk tweede cijfer.
- Als het resultaat van deze verdubbelingsoperatie groter is dan 9, trek dan 9 van het resultaat af.
- Tel alle cijfers in de resulterende reeks bij elkaar op.
- Als de som modulo 10 gelijk is aan 0 (als de som eindigt op nul), dan is het nummer geldig volgens de Luhn-formule; anders is het niet geldig.
Hier is een visuele weergave van het Luhn-algoritme:
Formule
Het Luhn-algoritme kan wiskundig worden uitgedrukt als volgt:
Laat het -de cijfer zijn, tellend vanaf het rechtercijfer (uitgezonderd het controlecijfer) en ga naar links. Dan wordt het controlecijfer gekozen zodat:
Waar de modulo-operatie is.
Toepassingen
Het Luhn-algoritme heeft verschillende toepassingen in verschillende velden:
- Validatie van creditcardnummers: De meeste creditcardnummers worden gevalideerd met behulp van het Luhn-algoritme.
- Canadese sociale verzekeringsnummers: Het Luhn-algoritme wordt gebruikt om de geldigheid van deze identificatienummers te verifiëren.
- IMEI-nummers: Mobiele telefoon IMEI-nummers bevatten een controlecijfer dat wordt gevalideerd door het Luhn-algoritme.
- Nationale zorgverlenersidentificatienummers (NPI): Gebruikt in het Amerikaanse gezondheidssysteem, deze nummers worden gevalideerd met behulp van het Luhn-algoritme.
- ISBN's: Sommige ISBN-10-nummers gebruiken een variant van het Luhn-algoritme voor validatie.
Alternatieven
Hoewel het Luhn-algoritme veel wordt gebruikt, zijn er andere controle-algoritmen voor verschillende doeleinden:
- Damm-algoritme: Een ander controlecijferalgoritme dat alle enkele cijferfouten en alle aangrenzende transpositie-fouten detecteert.
- Verhoeff-algoritme: Een complexer controle-algoritme dat alle enkele cijferfouten en de meeste transpositie-fouten opvangt.
- ISBN-13 controlecijfer: Gebruikt een ander algoritme dan ISBN-10, dat is gebaseerd op het Luhn-algoritme.
Geschiedenis
Het Luhn-algoritme werd in 1954 gemaakt door Hans Peter Luhn, een IBM-computerwetenschapper. Luhn was een pionier op het gebied van informatiekunde en wordt gecrediteerd met verschillende innovaties, waaronder het KWIC (Key Word In Context) indexeringssysteem.
Het algoritme was oorspronkelijk ontworpen om te beschermen tegen accidentele fouten, niet tegen kwaadwillige aanvallen. Het is belangrijk op te merken dat hoewel het Luhn-algoritme veel voorkomende fouten kan detecteren, het geen veilige vorm van encryptie is en niet moet worden vertrouwd voor gegevensbeveiligingsdoeleinden.
Ondanks zijn leeftijd blijft het Luhn-algoritme veel gebruikt vanwege de eenvoud en effectiviteit bij het opvangen van veelvoorkomende transcriptiefouten.
Implementatie Voorbeelden
Hier zijn enkele codevoorbeelden om het Luhn-algoritme te implementeren in verschillende programmeertalen:
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])))
## Voorbeeld gebruik:
print(luhn_validate(4532015112830366)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # Genereert een geldig 16-cijferig nummer
Randgevallen en Speciale Overwegingen
Bij het implementeren van het Luhn-algoritme, overweeg de volgende randgevallen en speciale overwegingen:
-
Invoer Validatie: Zorg ervoor dat de invoer een geldige nummerreeks is. Niet-cijfertekens moeten op de juiste manier worden behandeld (ofwel verwijderd of als ongeldige invoer behandeld).
-
Voorloopnullen: Het algoritme moet correct werken met nummers die voorloopnullen hebben.
-
Grote Nummers: Wees voorbereid om zeer lange nummers te verwerken die mogelijk de capaciteit van standaard integer-typen in sommige programmeertalen overschrijden.
-
Lege Invoer: Definieer hoe jouw implementatie moet omgaan met lege strings of null-invoeren.
-
Niet-standaard Tekenreeksen: In sommige toepassingen kun je nummers tegenkomen die worden weergegeven met tekens buiten het standaard 0-9 bereik. Definieer hoe deze moeten worden behandeld.
-
Prestatie Overwegingen: Voor toepassingen die een groot aantal invoeren snel moeten valideren, overweeg om de algoritme-implementatie te optimaliseren.
Numerieke Voorbeelden
-
Geldig Creditcardnummer:
- Nummer: 4532015112830366
- Luhn Controle: Geldig
-
Ongeldig Creditcardnummer:
- Nummer: 4532015112830367
- Luhn Controle: Ongeldig
-
Geldig Canadees Sociaal Verzekeringsnummer:
- Nummer: 046 454 286
- Luhn Controle: Geldig
-
Ongeldig IMEI-nummer:
- Nummer: 490154203237518
- Luhn Controle: Ongeldig
Testgevallen
Om de implementatie van het Luhn-algoritme te verifiëren, kun je de volgende testgevallen gebruiken:
def test_luhn_algorithm():
assert luhn_validate(4532015112830366) == True
assert luhn_validate(4532015112830367) == False
assert luhn_validate(79927398713) == True
assert luhn_validate(79927398714) == False
# Test gegenereerde nummers
for _ in range(10):
assert luhn_validate(generate_valid_number(16)) == True
print("Alle tests geslaagd!")
test_luhn_algorithm()
Referenties
- Luhn, H. P. (1960). "Computer for Verifying Numbers". US Patent 2,950,048.
- Gallian, Joseph. "The Mathematics of Identification Numbers." The College Mathematics Journal, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". International Organization for Standardization. Geraadpleegd op 2 augustus 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.