Validieren und generieren Sie Zahlen mithilfe des Luhn-Algorithmus, der häufig für Kreditkartennummern, kanadische Sozialversicherungsnummern und andere Identifikationsnummern verwendet wird. Überprüfen Sie, ob eine Nummer den Luhn-Test besteht, oder generieren Sie gültige Zahlen, die den Algorithmus einhalten.
Der Luhn-Algorithmus, auch bekannt als "Modulus 10" oder "mod 10" Algorithmus, ist eine einfache Prüfziffernformel, die verwendet wird, um eine Vielzahl von Identifikationsnummern zu validieren, wie z.B. Kreditkartennummern, kanadische Sozialversicherungsnummern, IMEI-Nummern und National Provider Identifier-Nummern in den Vereinigten Staaten. Dieser Rechner ermöglicht es Ihnen, Zahlen mithilfe des Luhn-Algorithmus zu validieren und gültige Zahlen zu generieren, die den Luhn-Test bestehen.
Der Luhn-Algorithmus funktioniert wie folgt:
Hier ist eine visuelle Darstellung des Luhn-Algorithmus:
Der Luhn-Algorithmus kann mathematisch wie folgt ausgedrückt werden:
Sei die -te Ziffer, gezählt von der rechtsstehenden Ziffer (ohne die Prüfziffer) und nach links bewegend. Dann wird die Prüfziffer so gewählt, dass:
Wobei die Modulo-Operation ist.
Der Luhn-Algorithmus hat verschiedene Anwendungen in unterschiedlichen Bereichen:
Obwohl der Luhn-Algorithmus weit verbreitet ist, gibt es andere Prüfziffernalgorithmen für verschiedene Zwecke:
Der Luhn-Algorithmus wurde 1954 von Hans Peter Luhn, einem IBM-Computerwissenschaftler, entwickelt. Luhn war ein Pionier auf dem Gebiet der Informationswissenschaft und wird mit mehreren Innovationen, einschließlich des KWIC (Key Word In Context) Indizierungssystems, in Verbindung gebracht.
Der Algorithmus wurde ursprünglich entwickelt, um gegen versehentliche Fehler zu schützen, nicht gegen böswillige Angriffe. Es ist wichtig zu beachten, dass der Luhn-Algorithmus viele häufige Fehler erkennen kann, jedoch keine sichere Form der Verschlüsselung ist und nicht für Datensicherheitszwecke verwendet werden sollte.
Trotz seines Alters bleibt der Luhn-Algorithmus aufgrund seiner Einfachheit und Effektivität bei der Erkennung häufiger Transkriptionsfehler weit verbreitet.
Hier sind einige Codebeispiele zur Implementierung des Luhn-Algorithmus in verschiedenen Programmiersprachen:
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## Beispielverwendung:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Generiert eine gültige 16-stellige Zahl
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// Beispielverwendung:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Generiert eine gültige 16-stellige Zahl
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)); // Generiert eine gültige 16-stellige Zahl
47 }
48}
49
Bei der Implementierung des Luhn-Algorithmus sollten Sie die folgenden Randfälle und besonderen Überlegungen berücksichtigen:
Eingangsvalidierung: Stellen Sie sicher, dass die Eingabe eine gültige Zahlenzeichenfolge ist. Nicht-Ziffernzeichen sollten angemessen behandelt werden (entweder entfernt oder als ungültige Eingabe behandelt).
Führende Nullen: Der Algorithmus sollte korrekt mit Zahlen funktionieren, die führende Nullen haben.
Große Zahlen: Seien Sie darauf vorbereitet, sehr lange Zahlen zu verarbeiten, die die Kapazität von Standard-Integer-Typen in einigen Programmiersprachen überschreiten könnten.
Leere Eingabe: Definieren Sie, wie Ihre Implementierung mit leeren Zeichenfolgen oder null-Eingaben umgehen sollte.
Nicht-standardisierte Zeichensätze: In einigen Anwendungen könnten Sie Zahlen antreffen, die mit Zeichen außerhalb des Standardbereichs 0-9 dargestellt werden. Definieren Sie, wie diese behandelt werden sollen.
Leistungsüberlegungen: Für Anwendungen, die eine große Anzahl von Eingaben schnell validieren müssen, sollten Sie die Implementierung des Algorithmus optimieren.
Gültige Kreditkartennummer:
Ungültige Kreditkartennummer:
Gültige kanadische Sozialversicherungsnummer:
Ungültige IMEI-Nummer:
Um die Implementierung des Luhn-Algorithmus zu überprüfen, können Sie die folgenden Testfälle verwenden:
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 generierte Zahlen
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Alle Tests bestanden!")
12
13test_luhn_algorithm()
14