Luhn-algoritme Calculator voor Nummervalidatie en Generatie
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.
Luhn Algoritme Calculator
Documentatie
Luhn Algoritme Calculator
Introductie
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.
Hoe het Luhn-algoritme werkt
Het Luhn-algoritme werkt als volgt:
- Begin vanaf het rechtercijfer (uitgezonderd het controlecijfer) en ga naar links, verdubbel de waarde van elk tweede cijfer.
- Als het resultaat van deze verdubbelingsoperatie groter is dan 9, trek dan 9 van het resultaat af.
- Tel alle cijfers in de resulterende reeks bij elkaar op.
- Als de som modulo 10 gelijk is aan 0 (als de som eindigt op nul), dan is het nummer geldig volgens de Luhn-formule; anders is het niet geldig.
Hier is een visuele weergave van het Luhn-algoritme:
Formule
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.
Toepassingen
Het Luhn-algoritme heeft verschillende toepassingen in verschillende velden:
- Validatie van creditcardnummers: De meeste creditcardnummers worden gevalideerd met behulp van het Luhn-algoritme.
- Canadese sociale verzekeringsnummers: Het Luhn-algoritme wordt gebruikt om de geldigheid van deze identificatienummers te verifiëren.
- IMEI-nummers: Mobiele telefoon IMEI-nummers bevatten een controlecijfer dat wordt gevalideerd door het Luhn-algoritme.
- Nationale zorgverlenersidentificatienummers (NPI): Gebruikt in het Amerikaanse gezondheidssysteem, deze nummers worden gevalideerd met behulp van het Luhn-algoritme.
- ISBN's: Sommige ISBN-10-nummers gebruiken een variant van het Luhn-algoritme voor validatie.
Alternatieven
Hoewel het Luhn-algoritme veel wordt gebruikt, zijn er andere controle-algoritmen voor verschillende doeleinden:
- Damm-algoritme: Een ander controlecijferalgoritme dat alle enkele cijferfouten en alle aangrenzende transpositie-fouten detecteert.
- Verhoeff-algoritme: Een complexer controle-algoritme dat alle enkele cijferfouten en de meeste transpositie-fouten opvangt.
- ISBN-13 controlecijfer: Gebruikt een ander algoritme dan ISBN-10, dat is gebaseerd op het Luhn-algoritme.
Geschiedenis
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.
Implementatie Voorbeelden
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
Randgevallen en Speciale Overwegingen
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.
Numerieke Voorbeelden
-
Geldig Creditcardnummer:
- Nummer: 4532015112830366
- Luhn Controle: Geldig
-
Ongeldig Creditcardnummer:
- Nummer: 4532015112830367
- Luhn Controle: Ongeldig
-
Geldig Canadees Sociaal Verzekeringsnummer:
- Nummer: 046 454 286
- Luhn Controle: Geldig
-
Ongeldig IMEI-nummer:
- Nummer: 490154203237518
- Luhn Controle: Ongeldig
Testgevallen
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
Referenties
- Luhn, H. P. (1960). "Computer for Verifying Numbers". US Patent 2,950,048.
- Gallian, Joseph. "The Mathematics of Identification Numbers." The College Mathematics Journal, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". International Organization for Standardization. Geraadpleegd op 2 augustus 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.
Feedback
Klik op de feedback-toast om feedback te geven over deze tool