Luhn-algoritme Kalkulator - Valider Kredittkortnummer og IMEI
Gratis Luhn mod 10 kalkulator for validering av kredittkort, IMEI-sjekk og ID-verifisering. Valider umiddelbart nummer eller generer testdata på nettet.
Luhn-algoritme kalkulator
Sjekk om nummeret ditt består Luhn mod 10-validering
Dokumentasjon
Forstå Luhn-algoritmen
Trenger du å verifisere et kredittkortnummer eller validere en IMEI? Luhn-algoritmen (eller "mod 10-algoritmen") er en kontrollsumformel som har vært ryggraden i betalingsverifisering siden 1954. IBM-forskeren Hans Peter Luhn designet denne elegante matematiske kontrollen for å fange opp skrivefeil og transkripsjonsfeil som plager manuell dataregistrering—som når du ved et uhell bytter om to sifre eller skriver feil ett enkelt tall.
Her er det som gjør den uvurderlig: alle store kredittkortnetterk (Visa, Mastercard, American Express), mobilenhetenes IMEI-numre, kanadiske trygdenumre og amerikanske helsetjenesteleverandørers identifikatorer er avhengige av denne algoritmen. Når du skriver inn et kortnummer i en betalingsformular og det umiddelbart avviser en feil, er det Luhn-kontrollen som er i aksjon.
Denne kalkulatoren lar deg validere enhver tallsekvens eller generere testdata som passerer verifisering—essensielt når du bygger betalingsintegrasjoner eller tester identifikasjonssystemer uten å bruke ekte kundedata.
Hvordan bruke denne kalkulatoren
Validering av eksisterende nummer: Skriv inn en hvilken som helst tallsekvens—som et 16-sifret kredittkort eller 15-sifret IMEI—og klikk "Valider". Du vil umiddelbart se om det passerer mod 10-sjekken, pluss en trinnvis gjennomgang av hvordan hvert siffer ble behandlet. Dette er spesielt nyttig når man feilsøker betalingsskjemaer eller verifiserer at dataregistreringen var nøyaktig.
Generering av testdata: Bytt til "Generer"-modus for å opprette gyldige testnummer av enhver lengde. Disse numrene passerer Luhn-verifiseringen, men er ikke ekte, aktive kort—noe som gjør dem perfekte for utviklingsmiljøer der du trenger realistiske testtilfeller uten å røre ved aktive betalingsopplysninger.
Forstå prosessen: Visualiseringen viser nøyaktig hva som skjer med hvert siffer: hvilke som dobles, når 9 trekkes fra, og hvordan den endelige summen bestemmer gyldigheten. Jeg har funnet denne visuelle tilbakemeldingen uvurderlig når jeg forklarer algoritmen til teammedlemmer eller feilsøker implementeringsproblemer.
Hvordan Luhn-algoritmen fungerer
Algoritmen behandler tall fra høyre mot venstre, ved å anvende et enkelt mønster som fanger opp de fleste dataregistreringsfeil:
-
Start fra høyre: Ta hver siffer, og beveg deg mot venstre. Hver andre siffer dobles (disse er de som står i partallsposisjoner når man teller fra høyre).
-
Håndter store doble verdier: Når dobling produserer et tall større enn 9, trekk fra 9. Dette er matematisk ekvivalent med å legge sammen de individuelle sifre (18 blir 1+8=9).
-
Summer alt: Legg sammen alle de behandlede sifre—både de doble/justerte og de uforandrede.
-
Sjekk delbarhet: Hvis summen deler jevnt på 10 (slutter på 0), er nummeret gyldig. Et hvilket som helst annet resultat betyr at det er en feil.
Det smarte med denne tilnærmingen er hvordan den fanger opp vanlige feil. Hvis du bytter om to tilstøtende sifre eller skriver feil ett enkelt nummer, vil sjekkesummen nesten alltid endre seg. Algoritmen vil ikke fange opp absolutt alle mulige feil—tvillingfeil som å bytte 22 til 55 slipper gjennom—men den fanger omtrent 98% av tilfeldige enkeltsifferfeil og rundt 90% av tilstøtende byttefeil.
Her er en visuell fremstilling av prosessen:
Matematisk formel
For de som foretrekker formell notasjon, her er det matematiske uttrykket:
La være det -te sifferet, regnet fra høyre (ekskludert kontrollsifferet) og beveger seg mot venstre. Så velges kontrollsifferet slik at:
Hvor er modulo-operasjonen.
Virkelige bruksområder
Betalingsbehandling: Alle store kortnettverk—Visa, Mastercard, American Express, Discover—bruker Luhn-sjekken som et førstelinjeforsvars mot skrivefeil. Når du bygger en betalingsside, sparer implementering av Luhn-validering på klientsiden brukerne dine fra å sende inn åpenbart feilaktige nummer og reduserer unødvendige API-kall til betalingsportaler.
Mobil enhetssporing: IMEI-nummer på telefoner og nettbrett inkluderer en Luhn-sjekksifre. Dette blir avgjørende i forsyningskjedestyring og enhetsgodkjenningssystemer—jeg har sett lagersystemer umiddelbart avvise ugyldige IMEI-skanninger, som forhindrer leveringsfeil før de oppstår.
Helseidentifikatorer: Det amerikanske nasjonale leverandøridentifikasjonssystemet (NPI) validerer leverandørnummer ved bruk av denne algoritmen. Med millioner av helsetransaksjoner daglig forhindrer fangst av avskrivningsfeil i leverandør-ID-er faktureringsforsinkelser og reduserer kravavvisninger.
Offentlig identifikasjon: Kanadiske sosiale forsikringsnummer inkorporerer Luhn-validering. Algoritmen gir en rask fornuftssjekk uten å kreve databaseoppslag, noe som gjør den effektiv for høyvolums verifikasjonscenarier.
Eldre bokesystemer: Noen ISBN-10-implementeringer bruker en Luhn-variant. Selv om ISBN-13 bruker en annen sjekksifferalgoritme, stoler eldre bibliotek- og lagersystemer fortsatt på Luhn-basert validering.
Trinnvise eksempler
Validering av et kredittkortnummer
La oss validere nummeret 4532015112830366:
- Starter fra høyre: 6, 6, 3, 0, 3, 8, 2, 1, 1, 5, 1, 0, 2, 3, 5, 4
- Doble annenhver siffer (fra høyre): 6, 12, 3, 0, 3, 16, 2, 2, 1, 10, 1, 0, 2, 6, 5, 8
- Trekk fra 9 fra tall > 9: 6, 3, 3, 0, 3, 7, 2, 2, 1, 1, 1, 0, 2, 6, 5, 8
- Sum: 6+3+3+0+3+7+2+2+1+1+1+0+2+6+5+8 = 50
- 50 % 10 = 0 ✓ Gyldig!
Fange et ugyldig IMEI-nummer
Tester 490154203237518 (det siste sifferet er bevisst feil):
- Etter dobling og prosessering: Sum = 57
- 57 % 10 = 7 ✗ Ugyldig!
Summen slutter ikke på null, så algoritmen merker dette som feil. For å gjøre det gyldig, skulle det siste sifferet være 1, som ville bringe summen til 60—perfekt delelig på 10. Dette er nøyaktig hvordan algoritmen fanger opp overføringsfeil i enhetsidentifikatorer.
Alternative Kontrollsumme-algoritmer
Luhn-algoritmen er populær fordi den er enkel å implementere, men mer sofistikerte alternativer eksisterer når du trenger sterkere feildeteksjon:
Verhoeff-algoritme: Fanger alle enkeltsifrede feil og nesten alle transposisjonsfeil, inkludert tvillingsiffer-tilfellene som Luhn går glipp av (som 22↔55). Kompromisset er økt kompleksitet—den krever oppslagstabeller med multiplikasjons- og permutasjonsoperasjoner. Bruk dette når datanøyaktighet er kritisk og beregningsmessig overhead ikke er et problem.
Damm-algoritme: Oppdager alle enkeltsifrede feil og alle tilstøtende transposisjoner uten unntak. Den er basert på en spesielt konstruert kvasigruppe-operasjon som sikrer fullstendig dekning. Implementeringen bruker en enkelt oppslagstabell, noe som gjør den enklere enn Verhoeff, men fortsatt mer kompleks enn Luhn.
ISBN-13 kontrollsifre: Bruker en vektet modulo 10-algoritme som er forskjellig fra både Luhn og ISBN-10. Vektene veksler mellom 1 og 3, noe som gir god feildeteksjon spesielt for bokidentifikatorer. Dette erstattet det eldre ISBN-10-systemet (som brukte Luhn) da bransjen trengte mer identifikatormessig plass.
Historikk og kontekst
Hans Peter Luhn utviklet denne algoritmen ved IBM i 1954, under de tidlige dagene av automatisert databehandling. Luhn var allerede kjent for banebrytende arbeid innen informasjonsgjenfinning—hans KWIC (Key Word In Context) indekseringssystem påvirket hvordan vi søker dokumenter den dag i dag—men mod 10-algoritmen ble hans mest vedvarende bidrag.
Her er den avgjørende forskjellen: Luhn designet dette for feildeteksjon, ikke sikkerhet. På 1950-tallet var problemet hull-kortfeil og manuelle overføringsfeil, ikke digital svindel. Algoritmen fanger opp tilfeldige skrivefeil briljant—men det er ikke kryptografi. Et gyldig Luhn-nummer betyr ikke at kortet er aktivt, finansiert eller tilhører personen som bruker det.
Det som er bemerkelsesverdig, er hvor godt en 70 år gammel algoritme fortsatt tjener sitt opprinnelige formål. Betalingsprosessorer legger til moderne sikkerhet (tokenisering, CVV-verifisering, 3D Secure), men den opprinnelige Luhn-kontrollen på klientsiden stopper fortsatt millioner av åpenbare feil daglig før de sløser båndbredde på betalingsgateway-anrop.
Implementasjonseksempler
Her er hvordan du implementerer Luhn-validering og generering i Python, JavaScript og Java. Disse eksemplene prioriterer lesbarhet samtidig som de opprettholder effektivitet:
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:
22
23print(luhn_validate(4532015112830366)) # Sant
24print(luhn_validate(4532015112830367)) # Usant
25print(generer_gyldig_nummer(16)) # Genererer et gyldig 16-sifret tall
261function luhnValidere(nummer) {
2 const sifre = nummer.toString().split('').map(Number);
3 let sjekksum = 0;
4 for (let i = sifre.length - 1; i >= 0; i--) {
5 let d = sifre[i];
6 if ((sifre.length - i) % 2 === 0) {
7 d *= 2;
8 if (d > 9) d -= 9;
9 }
10 sjekksum += d;
11 }
12 return sjekksum % 10 === 0;
13}
14
15function genererGyldigNummer(lengde) {
16 const sifre = Array.from({length: lengde - 1}, () => Math.floor(Math.random() * 10));
17 const sjekksum = sifre.reduce((sum, siffer, indeks) => {
18 if ((lengde - 1 - indeks) % 2 === 0) {
19 siffer *= 2;
20 if (siffer > 9) siffer -= 9;
21 }
22 return sum + siffer;
23 }, 0);
24 const sjekkSiffer = (10 - (sjekksum % 10)) % 10;
25 return parseInt(sifre.join('') + sjekkSiffer);
26}
27
28// Eksempel på bruk:
29console.log(luhnValidere(4532015112830366)); // sant
30console.log(luhnValidere(4532015112830367)); // usant
31console.log(genererGyldigNummer(16)); // Genererer et gyldig 16-sifret tall
321import java.util.Random;
2
3public class LuhnValidator {
4 public static boolean luhnValidere(long nummer) {
5 String sifre = String.valueOf(nummer);
6 int sjekksum = 0;
7 boolean erPartall = true;
8 for (int i = sifre.length() - 1; i >= 0; i--) {
9 int siffer = Character.getNumericValue(sifre.charAt(i));
10 if (erPartall) {
11 siffer *= 2;
12 if (siffer > 9) siffer -= 9;
13 }
14 sjekksum += siffer;
15 erPartall = !erPartall;
16 }
17 return sjekksum % 10 == 0;
18 }
19
20 public static long genererGyldigNummer(int lengde) {
21 Random tilfeldig = new Random();
22 long[] sifre = new long[lengde - 1];
23 for (int i = 0; i < lengde - 1; i++) {
24 sifre[i] = tilfeldig.nextInt(10);
25 }
26 long sjekksum = 0;
27 for (int i = sifre.length - 1; i >= 0; i--) {
28 long siffer = sifre[i];
29 if ((lengde - 1 - i) % 2 == 0) {
30 siffer *= 2;
31 if (siffer > 9) siffer -= 9;
32 }
33 sjekksum += siffer;
34 }
35 long sjekkSiffer = (10 - (sjekksum % 10)) % 10;
36 long resultat = 0;
37 for (long siffer : sifre) {
38 resultat = resultat * 10 + siffer;
39 }
40 return resultat * 10 + sjekkSiffer;
41 }
42
43 public static void main(String[] args) {
44 System.out.println(luhnValidere(4532015112830366L)); // sant
45 System.out.println(luhnValidere(4532015112830367L)); // usant
46 System.out.println(genererGyldigNummer(16)); // Genererer et gyldig 16-sifret tall
47 }
48}
49Kanttilfeller og implementeringsutfordringer
Når du implementerer Luhn-validering i produksjonssystemer, pass på disse vanlige problemene:
Inndatarensing: Virkelig input inneholder ofte mellomrom, bindestreker eller andre formateringskarakterer (som "4532-0151-1128-3036"). Fjern disse før validering i stedet for å avvise input—brukere kopierer ofte formaterte nummer. Avvis imidlertid alfabetiske tegn umiddelbart siden de indikerer genuint ugyldig input.
Ledende nuller er viktige: Et tall som "0123456789" er forskjellig fra "123456789" for Luhn-formål. Ledende nuller må bevares under validering. Dette snubler ofte utviklere som konverterer til heltall først—bruk strengoperasjoner i stedet.
Språkets heltallsgrenser: Kredittkort har vanligvis maks 19 sifre, som passer i et 64-bits heltall. Men hvis du validerer vilkårlige identifikatorer, unngå å konvertere til heltall. Behandle som strenger eller siffermatriser for å forhindre overflyt.
Tom eller null input: Definer oppførselen eksplisitt: kast en unntak, returner falskt, eller håndter elegant? Jeg har funnet at det gir mest mening å returnere falskt for valideringsfunksjoner, men API-endepunkter kan ønske å returnere en 400-feil med en beskrivende melding.
Ytelse i stor skala: For batch-validering (som å behandle opplastede CSV-filer med tusenvis av kortnummer), er den grunnleggende algoritmen allerede ganske rask—O(n) der n er sifferantall. Flaskehalsen er vanligvis I/O, ikke beregning. Fokuser optimalisering på filparsing og feilrapportering heller enn valideringslogikken selv.
Rask referanse: Testnumre
Bruk disse for å teste implementeringen din:
Gyldige numre:
4532015112830366— Visa-format (16 sifre)046454286— Canadisk SIN-format (9 sifre)79927398713— Generisk gyldig nummer
Ugyldige numre:
4532015112830367— Av med ett siffer490154203237518— Feil kontrollsiffer79927398714— Siste siffer er feil
Disse testtilfellene dekker vanlige scenarioer: standard gyldige numre, enkeltsiffer-feil og feil kontrollsifre.
Automatisert Testsuite
Her er en omfattende testsuite for å validere implementasjonen din:
1def test_luhn_algoritme():
2 # Grunnleggende valideringstester
3 assert luhn_validate(4532015112830366) == True
4 assert luhn_validate(4532015112830367) == False
5 assert luhn_validate(79927398713) == True
6 assert luhn_validate(79927398714) == False
7
8 # Test at genererte nummer faktisk består validering
9 for _ in range(10):
10 generert = generate_valid_number(16)
11 assert luhn_validate(generert) == True, f"Generert {generert} besto ikke validering"
12
13 # Grensetilfelle: enkelt siffer
14 assert luhn_validate(0) == True # 0 mod 10 = 0
15
16 # Grensetilfelle: ledende nuller bevares
17 assert luhn_validate("0000000000000000") != luhn_validate(0)
18
19 print("Alle tester bestått!")
20
21test_luhn_algoritme()
22Ofte stilte spørsmål
Hva brukes Luhn-algoritmen til?
Luhn-algoritmen validerer identifikasjonsnumre, inkludert kredittkort (Visa, Mastercard, Amex), mobilenheters IMEI-numre, kanadiske trygdenumre og amerikanske helsepersonell-NPI-numre. Den fanger opp vanlige datafeil—som feilskrevne sifre eller utilsiktet byttet rekkefølge—før de forårsaker behandlingsfeil eller mislykkede transaksjoner.
Hvor nøyaktig er Luhn-algoritmen til å oppdage feil?
Luhn fanger omtrent 98% av enkeltsifferfeil og rundt 90% av tilstøtende transposisjonsfeil (som å skrive "12" i stedet for "21"). Imidlertid går den glipp av tvillingfeil der begge sifrene er like (22→55) og hopp-transposisjoner (101→404). For de fleste praktiske bruksområder som involverer manuell dataregistrering, er denne oppdagelsesraten tilstrekkelig.
Kan jeg validere kredittkort offline med Luhn-algoritmen?
Ja, Luhn-validering fungerer helt offline—det er ren matematikk som ikke krever databaseoppslag eller API-kall. Dette gjør den perfekt for klientsidevalidering i webskjemaer, som reduserer serverbelastningen og gir umiddelbar tilbakemelding til brukerne. Men husk: et gyldig Luhn-nummer betyr ikke at kortet er aktivt eller har tilgjengelig kreditt.
Er Luhn-algoritmen sikker for betalingsbehandling?
Nei—Luhn er feildeteksjon, ikke sikkerhet. Den verifiserer kun matematisk format. En bestått Luhn-sjekk bekrefter ikke at kortet er ekte, aktivt, finansiert eller tilhører brukeren. Modern betalingssikkerhet krever flere lag: CVV/CVC-verifisering, adressevalidering (AVS), 3D Secure-autentisering og tokenisering. Luhn er bare den første fornuftssjekken.
Hvilke programmeringsspråk støtter Luhn-implementering?
Alle generelle programmeringsspråk kan implementere Luhn—det er en enkel algoritme som bare krever grunnleggende aritmetikk og løkker. Python, JavaScript, Java, C++, C#, PHP, Ruby, Go, Rust og Swift håndterer den enkelt på 10-20 linjer kode. Noen språk har tredjepartsbiblioteker, men algoritmen er enkel nok til at de fleste utviklere implementerer den direkte.
Hvorfor kalles den mod 10-algoritmen?
Det siste trinnet sjekker om siffersummen er delelig med 10 ved bruk av modulooperasjonen (sum % 10 == 0). "Mod 10" refererer til denne modulus 10-sjekken. Hvis resten er null når man deler på 10, består nummeret—ellers stryker det. Denne matematiske egenskapen er det som gjør algoritmen virksom.
Kan jeg generere test-kreditkortnumre med Luhn?
Ja—du kan generere numre som består Luhn-validering for å teste betalingsskjemaer under utvikling. Dette er ikke ekte, aktive kort; de oppfyller bare det matematiske formatet. Dette er lovlig og nødvendig for testing, men å forsøke å bruke genererte numre for faktiske kjøp er svindel. De fleste betalingsportaler tilbyr offisielle testkort for staging-miljøer.
Hva er begrensningene til Luhn-algoritmen?
Luhn vil ikke oppdage: tvillingfeil (22↔55), hopp-transposisjoner (101↔404), fonetiske feil (60↔06 i noen tilfeller) eller flere samtidige feil. Den gir heller ingen kryptografisk sikkerhet—gyldig format betyr ikke gyldig kort. Til tross for disse begrensningene gjør dens enkelhet og over 90% feildeteksjonsrate den praktisk for virkelige betalingssystemer når den kombineres med andre verificeringsmetoder.
Start Validering av Nummer
Bruk kalkulatoren over for å validere kredittkort-nummer, generere testdata for utviklingsmiljøer, eller utforsk hvordan mod 10-algoritmen behandler hver enkelt siffer. Den trinnvise visualiseringen hjelper med å feilsøke implementeringsproblemer og forklarer valideringsresultater til ikke-tekniske interessenter.
Enten du bygger en betalingsformular, feilsøker et IMEI-valideringssystem, eller bare lærer om kontrollsumalgoritmer, gir dette verktøyet umiddelbar tilbakemelding og teknisk åpenhet du trenger.
Referanser og videre lesning
-
Luhn, H. P. (1960). "Datamaskin for verifisering av tall". US Patent 2,950,048 - Den opprinnelige patenten som beskriver algoritmen.
-
ISO/IEC 7812-1:2017 - Identifikasjonskort - Internasjonal standard for identifikasjonskort-nummeringssystemer, som spesifiserer Luhn-bruk for betalingskort.
-
Gallian, Joseph (1991). "Matematikken bak identifikasjonsnumre" - Akademisk analyse av forskjellige kontrollsiffealgoritmer, inkludert Luhn, publisert i The College Mathematics Journal.
-
Payment Card Industry Data Security Standard (PCI DSS) - Sikkerhetsstandard som styrer hvordan betalingskortdata må håndteres, som gir kontekst for hvor Luhn passer inn i sikkerhetsstrukturen.