Luhn-Algorithmus Rechner zur Validierung von Nummern
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.
Luhn-Algorithmus Rechner
Dokumentation
Luhn-Algorithmus Rechner
Einführung
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.
Funktionsweise des Luhn-Algorithmus
Der Luhn-Algorithmus funktioniert wie folgt:
- Beginnen Sie mit der rechtsstehenden Ziffer (ohne die Prüfziffer) und bewegen Sie sich nach links, verdoppeln Sie den Wert jeder zweiten Ziffer.
- Wenn das Ergebnis dieser Verdopplungsoperation größer als 9 ist, ziehen Sie 9 vom Ergebnis ab.
- Addieren Sie alle Ziffern in der resultierenden Sequenz.
- Wenn die Summe modulo 10 gleich 0 ist (wenn die Summe mit null endet), dann ist die Zahl gemäß der Luhn-Formel gültig; andernfalls ist sie ungültig.
Hier ist eine visuelle Darstellung des Luhn-Algorithmus:
Formel
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.
Anwendungsfälle
Der Luhn-Algorithmus hat verschiedene Anwendungen in unterschiedlichen Bereichen:
- Kreditkartenvalidierung: Die meisten Kreditkartennummern werden mit dem Luhn-Algorithmus validiert.
- Kanadische Sozialversicherungsnummern: Der Luhn-Algorithmus wird verwendet, um die Gültigkeit dieser Identifikationsnummern zu überprüfen.
- IMEI-Nummern: Mobiltelefon-IMEI-Nummern enthalten eine Prüfziffer, die durch den Luhn-Algorithmus validiert wird.
- National Provider Identifier (NPI) Nummern: Diese Nummern werden im Gesundheitssystem der Vereinigten Staaten verwendet und mit dem Luhn-Algorithmus validiert.
- ISBNs: Einige ISBN-10-Nummern verwenden eine Variante des Luhn-Algorithmus zur Validierung.
Alternativen
Obwohl der Luhn-Algorithmus weit verbreitet ist, gibt es andere Prüfziffernalgorithmen für verschiedene Zwecke:
- Damm-Algorithmus: Ein weiterer Prüfziffernalgorithmus, der alle einstelligen Fehler und alle benachbarten Transpositionsfehler erkennt.
- Verhoeff-Algorithmus: Ein komplexerer Prüfziffernalgorithmus, der alle einstelligen Fehler und die meisten Transpositionsfehler erkennt.
- ISBN-13 Prüfziffer: Verwendet einen anderen Algorithmus als ISBN-10, der auf dem Luhn-Algorithmus basiert.
Geschichte
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.
Implementierungsbeispiele
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
Randfälle und besondere Überlegungen
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.
Numerische Beispiele
-
Gültige Kreditkartennummer:
- Nummer: 4532015112830366
- Luhn-Check: Gültig
-
Ungültige Kreditkartennummer:
- Nummer: 4532015112830367
- Luhn-Check: Ungültig
-
Gültige kanadische Sozialversicherungsnummer:
- Nummer: 046 454 286
- Luhn-Check: Gültig
-
Ungültige IMEI-Nummer:
- Nummer: 490154203237518
- Luhn-Check: Ungültig
Testfälle
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
Referenzen
- 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. Abgerufen am 2. August 2024.
- Knuth, Donald. "The Art of Computer Programming, Volume 2: Seminumerical Algorithms". Addison-Wesley, 1997.
Rückmeldung
Klicken Sie auf den Feedback-Toast, um mit dem Feedback zu diesem Tool zu beginnen.