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-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.
Luhn-algoritmen fungerer som fĂžlger:
Her er en visuell representasjon av Luhn-algoritmen:
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.
Luhn-algoritmen har ulike applikasjoner i forskjellige felt:
Selv om Luhn-algoritmen er mye brukt, finnes det andre sjekksum-algoritmer for forskjellige formÄl:
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.
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
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.
Gyldig kredittkortnummer:
Ugyldig kredittkortnummer:
Gyldig kanadisk personnummer:
Ugyldig IMEI-nummer:
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