Valideer en genereer nummers met behulp van het Luhn-algoritme, dat vaak wordt gebruikt voor creditcardnummers, Canadese sociale verzekeringsnummers en andere identificatienummers. Test of een nummer de Luhn-controle doorstaat of genereer geldige nummers die voldoen aan het algoritme.
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.
Het Luhn-algoritme werkt als volgt:
Hier is een visuele weergave van het Luhn-algoritme:
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.
Het Luhn-algoritme heeft verschillende toepassingen in verschillende velden:
Hoewel het Luhn-algoritme veel wordt gebruikt, zijn er andere controle-algoritmen voor verschillende doeleinden:
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.
Hier zijn enkele codevoorbeelden om het Luhn-algoritme te implementeren in verschillende programmeertalen:
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## Voorbeeld gebruik:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Genereert een geldig 16-cijferig 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// Voorbeeld gebruik:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genereert een geldig 16-cijferig 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)); // Genereert een geldig 16-cijferig nummer
47 }
48}
49
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.
Geldig Creditcardnummer:
Ongeldig Creditcardnummer:
Geldig Canadees Sociaal Verzekeringsnummer:
Ongeldig IMEI-nummer:
Om de implementatie van het Luhn-algoritme te verifiëren, kun je de volgende testgevallen gebruiken:
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 gegenereerde nummers
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Alle tests geslaagd!")
12
13test_luhn_algorithm()
14