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:
- Start fra den hÞyre mest sifret (unntatt sjekk-sifret) og gÄ mot venstre, doble verdien av hvert andre siffer.
- Hvis resultatet av denne doble operasjonen er stĂžrre enn 9, trekk 9 fra resultatet.
- Summer alle sifrene i den resulterende sekvensen.
- 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:
Formel
Luhn-algoritmen kan uttrykkes matematisk som fĂžlger:
La vĂŠre det -te sifferet, teller fra det hĂžyre mest sifferet (unntatt sjekk-sifret) og beveger seg mot venstre. Da velges sjekk-sifferet slik at:
Hvor er modulo-operasjonen.
BruksomrÄder
Luhn-algoritmen har ulike applikasjoner i forskjellige felt:
- Kredittkortvalidering: De fleste kredittkortnumre valideres ved hjelp av Luhn-algoritmen.
- Kanadiske personnummer: Luhn-algoritmen brukes til Ă„ verifisere gyldigheten av disse identifikasjonsnumrene.
- IMEI-numre: Mobiltelefon IMEI-numre inkluderer et sjekk-siffer validert av Luhn-algoritmen.
- Nasjonale leverandĂžridentifikasjonsnumre (NPI): Brukt i det amerikanske helsevesenet, disse numrene valideres ved hjelp av Luhn-algoritmen.
- 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:
- Damm-algoritmen: En annen sjekk-siffer algoritme som oppdager alle enkelt-digit feil og alle nabotransposisjonsfeil.
- Verhoeff-algoritmen: En mer kompleks sjekk-siffer algoritme som fanger opp alle enkelt-digit feil og de fleste transposisjonsfeil.
- 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
1function luhnValidate(number) {
2 const digits = number.toString().split('').map(Number);
3 let checksum = 0;
4 for (let i = digits.length - 1; i >= 0; i--) {
5 let d = digits[i];
6 if ((digits.length - i) % 2 === 0) {
7 d *= 2;
8 if (d > 9) d -= 9;
9 }
10 checksum += d;
11 }
12 return checksum % 10 === 0;
13}
14
15function generateValidNumber(length) {
16 const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
17 const checksum = digits.reduce((sum, digit, index) => {
18 if ((length - 1 - index) % 2 === 0) {
19 digit *= 2;
20 if (digit > 9) digit -= 9;
21 }
22 return sum + digit;
23 }, 0);
24 const checkDigit = (10 - (checksum % 10)) % 10;
25 return parseInt(digits.join('') + checkDigit);
26}
27
28// Eksempel pÄ bruk:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genererer et gyldig 16-sifret nummer
32
1import java.util.Random;
2
3public class LuhnValidator {
4 public static boolean luhnValidate(long number) {
5 String digits = String.valueOf(number);
6 int checksum = 0;
7 boolean isEven = true;
8 for (int i = digits.length() - 1; i >= 0; i--) {
9 int digit = Character.getNumericValue(digits.charAt(i));
10 if (isEven) {
11 digit *= 2;
12 if (digit > 9) digit -= 9;
13 }
14 checksum += digit;
15 isEven = !isEven;
16 }
17 return checksum % 10 == 0;
18 }
19
20 public static long generateValidNumber(int length) {
21 Random random = new Random();
22 long[] digits = new long[length - 1];
23 for (int i = 0; i < length - 1; i++) {
24 digits[i] = random.nextInt(10);
25 }
26 long checksum = 0;
27 for (int i = digits.length - 1; i >= 0; i--) {
28 long digit = digits[i];
29 if ((length - 1 - i) % 2 == 0) {
30 digit *= 2;
31 if (digit > 9) digit -= 9;
32 }
33 checksum += digit;
34 }
35 long checkDigit = (10 - (checksum % 10)) % 10;
36 long result = 0;
37 for (long digit : digits) {
38 result = result * 10 + digit;
39 }
40 return result * 10 + checkDigit;
41 }
42
43 public static void main(String[] args) {
44 System.out.println(luhnValidate(4532015112830366L)); // true
45 System.out.println(luhnValidate(4532015112830367L)); // false
46 System.out.println(generateValidNumber(16)); // Genererer et gyldig 16-sifret nummer
47 }
48}
49
Kanttilfeller og spesielle hensyn
NÄr du implementerer Luhn-algoritmen, vurder fÞlgende kanttilfeller og spesielle hensyn:
-
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).
-
Ledende nuller: Algoritmen bĂžr fungere korrekt med numre som har ledende nuller.
-
Store tall: VÊr forberedt pÄ Ä hÄndtere veldig lange numre som kan overstige kapasiteten til standard heltallstyper i noen programmeringssprÄk.
-
Tom inndata: Definer hvordan implementeringen din skal hÄndtere tomme strenger eller null-inndata.
-
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.
-
Ytelsesvurderinger: For applikasjoner som trenger Ă„ validere store mengder inndata raskt, vurder Ă„ optimalisere algoritmeimplementeringen.
Numeriske eksempler
-
Gyldig kredittkortnummer:
- Nummer: 4532015112830366
- Luhn-sjekk: Gyldig
-
Ugyldig kredittkortnummer:
- Nummer: 4532015112830367
- Luhn-sjekk: Ugyldig
-
Gyldig kanadisk personnummer:
- Nummer: 046 454 286
- Luhn-sjekk: Gyldig
-
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
- Luhn, H. P. (1960). "Computer for Verifying Numbers". US Patent 2,950,048.
- Gallian, Joseph. "Matematikk for identifikasjonsnumre." The College Mathematics Journal, vol. 22, no. 3, 1991, s. 194â202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". International Organization for Standardization. Hentet 2. august 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.
Tilbakemelding
Klikk pÄ tilbakemeldings-toasten for Ä begynne Ä gi tilbakemelding om dette verktÞyet