Luhn Algorithm Calculator for Number Validation and Generation

Valider og generer tall ved hjelp av Luhn-algoritmen, som ofte brukes for kredittkortnumre, kanadiske sosiale forsikringsnumre og andre identifikasjonsnumre. Test om et tall passerer Luhn-sjekken eller generer gyldige tall som overholder algoritmen.

Luhn-algoritme Kalkulator

📚

Dokumentasjon

Luhn-algoritmen kalkulator

Innledning

Luhn-algoritmen, ogsÄ kjent som "modulus 10" eller "mod 10" algoritmen, er en enkel sjekksumformel som brukes til Ä validere en rekke identifikasjonsnumre, som kredittkortnumre, kanadiske personnummer, IMEI-numre og nasjonale leverandÞridentifikasjonsnumre i USA. Denne kalkulatoren lar deg validere numre ved hjelp av Luhn-algoritmen og generere gyldige numre som passerer Luhn-sjekken.

Hvordan Luhn-algoritmen fungerer

Luhn-algoritmen fungerer som fĂžlger:

  1. Start fra den hÞyre mest sifret (unntatt sjekk-sifret) og gÄ mot venstre, doble verdien av hvert andre siffer.
  2. Hvis resultatet av denne doble operasjonen er stĂžrre enn 9, trekk 9 fra resultatet.
  3. Summer alle sifrene i den resulterende sekvensen.
  4. Hvis totalen modulo 10 er lik 0 (hvis totalen ender med null), sÄ er nummeret gyldig i henhold til Luhn-formelen; ellers er det ikke gyldig.

Her er en visuell representasjon av Luhn-algoritmen:

1. Doble hvert andre siffer 2. Summer sifrene (9 for doblede > 9) 3. Beregn total summen 4. Sjekk om sum % 10 == 0

Formel

Luhn-algoritmen kan uttrykkes matematisk som fĂžlger:

La did_i vĂŠre det ii-te sifferet, teller fra det hĂžyre mest sifferet (unntatt sjekk-sifret) og beveger seg mot venstre. Da velges sjekk-sifferet d0d_0 slik at:

(2d2n mod 9+d2n−1+2d2n−2 mod 9+d2n−3+⋯+2d2 mod 9+d1+d0) mod 10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

Hvor  mod \bmod er modulo-operasjonen.

BruksomrÄder

Luhn-algoritmen har ulike applikasjoner i forskjellige felt:

  1. Kredittkortvalidering: De fleste kredittkortnumre valideres ved hjelp av Luhn-algoritmen.
  2. Kanadiske personnummer: Luhn-algoritmen brukes til Ă„ verifisere gyldigheten av disse identifikasjonsnumrene.
  3. IMEI-numre: Mobiltelefon IMEI-numre inkluderer et sjekk-siffer validert av Luhn-algoritmen.
  4. Nasjonale leverandĂžridentifikasjonsnumre (NPI): Brukt i det amerikanske helsevesenet, disse numrene valideres ved hjelp av Luhn-algoritmen.
  5. ISBN: Noen ISBN-10-numre bruker en variant av Luhn-algoritmen for validering.

Alternativer

Selv om Luhn-algoritmen er mye brukt, finnes det andre sjekksum-algoritmer for forskjellige formÄl:

  1. Damm-algoritmen: En annen sjekk-siffer algoritme som oppdager alle enkelt-digit feil og alle nabotransposisjonsfeil.
  2. Verhoeff-algoritmen: En mer kompleks sjekk-siffer algoritme som fanger opp alle enkelt-digit feil og de fleste transposisjonsfeil.
  3. ISBN-13 sjekk-siffer: Bruker en annen algoritme enn ISBN-10, som er basert pÄ Luhn-algoritmen.

Historie

Luhn-algoritmen ble laget av Hans Peter Luhn, en IBM-datavitenskapsmann, i 1954. Luhn var en pioner innen informasjonsteknologi og er kreditert med flere innovasjoner, inkludert KWIC (Key Word In Context) indekseringssystemet.

Algoritmen ble opprinnelig designet for Ä beskytte mot utilsiktede feil, ikke ondsinnede angrep. Det er viktig Ä merke seg at selv om Luhn-algoritmen kan oppdage mange vanlige feil, er det ikke en sikker form for kryptering og bÞr ikke stole pÄ for databeskyttelsesformÄl.

Til tross for sin alder, forblir Luhn-algoritmen mye brukt pÄ grunn av sin enkelhet og effektivitet i Ä fange opp vanlige transkripsjonsfeil.

Implementeringseksempler

Her er noen kodeeksempler for Ä implementere Luhn-algoritmen i forskjellige programmeringssprÄk:

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## Eksempel pÄ bruk:
22print(luhn_validate(4532015112830366))  # True
23print(luhn_validate(4532015112830367))  # False
24print(generate_valid_number(16))  # Genererer et gyldig 16-sifret nummer
25

Kanttilfeller og spesielle hensyn

NÄr du implementerer Luhn-algoritmen, vurder fÞlgende kanttilfeller og spesielle hensyn:

  1. Inndata Validering: SÞrg for at inndata er en gyldig nummerserie. Ikke-siffertegn bÞr hÄndteres pÄ passende mÄte (enten fjernes eller behandles som ugyldige inndata).

  2. Ledende nuller: Algoritmen bĂžr fungere korrekt med numre som har ledende nuller.

  3. Store tall: VÊr forberedt pÄ Ä hÄndtere veldig lange numre som kan overstige kapasiteten til standard heltallstyper i noen programmeringssprÄk.

  4. Tom inndata: Definer hvordan implementeringen din skal hÄndtere tomme strenger eller null-inndata.

  5. Ikke-standard tegnsett: I noen applikasjoner kan du stÞte pÄ numre representert med tegn utenfor standard 0-9 rekkevidde. Definer hvordan disse skal hÄndteres.

  6. Ytelsesvurderinger: For applikasjoner som trenger Ă„ validere store mengder inndata raskt, vurder Ă„ optimalisere algoritmeimplementeringen.

Numeriske eksempler

  1. Gyldig kredittkortnummer:

    • Nummer: 4532015112830366
    • Luhn-sjekk: Gyldig
  2. Ugyldig kredittkortnummer:

    • Nummer: 4532015112830367
    • Luhn-sjekk: Ugyldig
  3. Gyldig kanadisk personnummer:

    • Nummer: 046 454 286
    • Luhn-sjekk: Gyldig
  4. Ugyldig IMEI-nummer:

    • Nummer: 490154203237518
    • Luhn-sjekk: Ugyldig

Testtilfeller

For Ă„ verifisere implementeringen av Luhn-algoritmen, kan du bruke fĂžlgende testtilfeller:

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    # Test genererte numre
8    for _ in range(10):
9        assert luhn_validate(generate_valid_number(16)) == True
10    
11    print("Alle tester bestÄtt!")
12
13test_luhn_algorithm()
14

Referanser

  1. Luhn, H. P. (1960). "Computer for Verifying Numbers". US Patent 2,950,048.
  2. Gallian, Joseph. "Matematikk for identifikasjonsnumre." The College Mathematics Journal, vol. 22, no. 3, 1991, s. 194–202. JSTOR, www.jstor.org/stable/2686878.
  3. "ISO/IEC 7812-1:2017". International Organization for Standardization. Hentet 2. august 2024.
  4. Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.