Diskussion:Luhn-Algorithmus

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Der C-Code ist C++; "reiner C-Code" geht so:

  1. include <stdlib.h> // für atoi
  2. include <string.h> // für strlen

int checkLuhn(char *pPurported)

{
  int i,nDigit;
  int nSum       = 0;
  int nDigits    = strlen(pPurported);
  int nParity    = (nDigits-1) % 2;
  char cDigit[2] = "\0\0"; // atoi erwartet einen null-terminierten String
  for (i = nDigits; i > 0 ; i--)
  { 
    cDigit[0]  = pPurported[i-1];
    nDigit = atoi(cDigit);

    if (nParity == i % 2)
      nDigit = nDigit * 2;

    nSum += nDigit/10;
    nSum += nDigit%10; 
  }
  return 0 == nSum % 10;
} (nicht signierter Beitrag von Fraba (Diskussion | Beiträge) 20:37, 3. Mai 2011 (CEST)) [Beantworten]

Dieser Text basiert auf einer Übersetzung des Artikels en:Luhn algorithm - Version vom 16. Januar 2006.

- Fängt der Luhn-Algorithmus nicht "vorne" mit Gewichtung 1212... an?

 Die Deutsche Bundesbank hat Publikationen zur Berechnung der Kontonummer und diese
 verwendet ebenfalls den Luhn Algorithmus nur mit anderer Gewichtung (z.B 123123...)
 Dort wird der Algorithmus "beginnend von vorne" abgelaufen.

- Zu oben: Ich verstehe "Beginnend mit der zweitletzten Ziffer und nach links durchlaufend, verdopple den Wert jeder zweiten Ziffer." so, dass der Algorithmus immer mit ...121 endet.

- Ich denke, mindestens die Java-Implementierung ist fehlerhaft für Zahlen mit einer geraden Anzahl von Ziffern, ich habe das auch ausprobiert. Der Code weicht hier von Pseudocode ab:

 int digit := integer(purportedCC[i]) // Die Ziffern werden von "links" durchlaufen

vs.

 int digit = digits[length - i - 1];  // Die Ziffern werden von "rechts" durchlaufen

Bei einer geraden Anzahl von Ziffern vertauscht dies die Ziffern mit Faktor 1 mit denen mit Faktor 2 --JoBee 19:56, 30. Jul. 2009 (CEST)[Beantworten]

Prüfzifferermittlung[Quelltext bearbeiten]

Wie wär's mit einem Hinweis auf das Verfahren, wie eine Prüfziffer zu ermitteln ist? (nicht signierter Beitrag von 84.118.90.4 (Diskussion) 01:01, 18. Okt. 2014 (CEST))[Beantworten]

Genau das habe ich mir auch gedacht. 9 Jahre Später ist das noch nicht drin... --87.245.121.50 11:18, 12. Apr. 2023 (CEST)[Beantworten]
Naja, man nennt die letzte Prüfziffer halt x und rechnet drauf los. Das x ist dann die Entfernung zur nächsthöheren Zehnerzahl. Also z.B. 38+x => x = 2, 45 + x => x = 5, 60 +x => x = 0 . -Koppapa (Diskussion) 15:05, 12. Apr. 2023 (CEST)[Beantworten]
Es wäre vielleicht schon ganz nett, wenn bei dem verwendeten Beispiel (18937) die sich ergebende Prüfziffer genannt würde. Ergibt sie sich vielleicht aus dem Ergebnis (30)? Wenn ich mir das Bild mit der Lok-Nummer anschaue, ergäbe sich nach dem Luhn-Algorithmus aus der "110 494" (also ohne die Prüfziffer): 4 + (2·9-9) + 4 + (2·0) + 1 + (2·1) = 4 + 9 + 4 + 0 + 1 + 2 = 20 (also gültig). Die Prüfziffer ist die "2", daher meine erste Vermutung, dass sie sich durch Division mit 10 ergibt. Kann aber auch Zufall sein. Weiß das jemand?
Übrigens: in der Bildunterschrift steht "Loknummer mit Prüfsumme". Sollte das nicht besser "Prüfziffer" heißen?
@Koppapa: Wenn nach dem Luhn-Algorithmus für eine gültige Ziffernfolge immer eine durch 10 teilbare Zahl rauskommen muss, dann wäre doch nach deiner Ausführung jede Prüfziffer = "0", oder hab' ich da was nicht verstanden? Gruß, --Dschanz → Blabla  12:45, 13. Apr. 2023 (CEST)[Beantworten]
Hab es mal auf Prüfziffer geändert, stimmt. Nach der Vorschrift wird von hinten jede 2. Zahl verdoppelt (also inklusive Prüfziffer). Wenn du nun aber die Prüfziffer abdeckst/nicht beachtest, dann muss sogesehen die letzte Zahl schon verdoppelt werden. Dann kommt man auf 28. Also muss die 2 hintendran. -Koppapa (Diskussion) 14:14, 13. Apr. 2023 (CEST)[Beantworten]
Jetzt hab ich nochmal rumgerechnet und überlegt. Kann es sein, dass die Aussage "Der Luhn-Algorithmus erzeugt eine Prüfziffer, die in der Regel hinten an die unvollständige Identifikationsnummer angehängt wird." nicht ganz korrekt ist? Oder wenn doch, stellt sich schon wieder die Frage: Wie ergibt sich diese Prüfziffer?
Und wird die Ziffernfolge dann inklusive der angehängten Prüfziffer nochmals dem Luhn-Algorithmus unterzogen? So jedenfalls verstehe ich die ersten drei Sätze des Abschnitts "Informelle Erläuterung".
Dummerweise ist das auch aus dem Rechenbeispiel nicht rauszukriegen, denn die 18937 (wie im Artikel vorgerechnet) ergibt eine Zehnerzahl, aber wenn man unterstellt, dass die "7" die angehängte Prüfziffer sei (woher auch immer die kommt…), auch die 1893 ergibt nach Luhn die Summe 20, also auch wieder eine Zehnerzahl. Dasselbe übrigens auch bei der Loknummer aus dem Bild: die 110 494 (wie oben gerechnet) ergibt die Luhn-Summe 20, aber auch mit der angehängten "2" ergibt sich aus 110 494-2 die Luhn-Summe 30. Irgendwie ist das verwirrend.
Vielleicht sollte der Artikel mal dahingehend überarbeitet werden, insbesondere was die Prüfziffer und den Unterschied zur Prüfsumme angeht, damit man die Beispiele auch ohne Vorwissen eindeutig nachvollziehen kann. --Dschanz → Blabla  13:12, 13. Apr. 2023 (CEST)[Beantworten]
Ja, 7 ist die Prüfziffer. Wenn ich die Prüfziffer nicht kenne, also nur 1893 habe und dafür ne Prüfziffer generieren möchte. Dann rechne ich quasi mit 1893x : x + 2*3 + 9 + (2*8-9) + 1 = 23 + x ... damit das auf 0 endet muss also x = 7 gelten. Damit ist die Prüfziffer für 1893 die 7. Also 18937 ist eine gültige Nummer. Die erhält dann keine weitere Prüfziffer mehr. Das wäre ja immer ne 0 bei einer schon gültigen Nummer. -Koppapa (Diskussion) 14:47, 13. Apr. 2023 (CEST)[Beantworten]
Jetzt wird die Sache klarer! Also fängt man bei der Zählung der Stelle (für Verdoppeln oder nicht Verdoppeln) des Luhn-Algorithmus sozusagen mit der noch nicht vorhandenen Prüfziffer an. Das ging vorher nicht so ganz eindeutig aus der "Anleitung" hervor. Es gibt ja noch andere Arten von Prüfverfahren (z. B. hier), bei denen die zu prüfende Zahl komplett unabhängig von der noch zu ermittelnden Prüfziffer durch einen Algorithmus gejagt werden. Vielen Dank für die Erläuterung! Gruß, --Dschanz → Blabla  12:23, 14. Apr. 2023 (CEST)[Beantworten]

Ist der Algorithmus besonders gut?[Quelltext bearbeiten]

Irgendwie wirkt der Algorithmus auf mich gefrickelt. Ist der beweisbar besonders gut, das heißt erkennt er die speziellen Fehler wir Zahlendreher besonders gut? Gibt es da nichts einfacheres und besseres? --Siehe-auch-Löscher (Diskussion) 17:13, 7. Dez. 2016 (CET)[Beantworten]

Zi viele Code Beispiele[Quelltext bearbeiten]

AUch dieser Artikel scheint mir wie eine Sammlung von Code in jeder Programmiersprache die ein Leser mal beigetragen hat. Kann gerne Delphi Code beitragen. Nur ist das sinnvoll? Pseudo Code würde eigentlich reichen, der wäre aussagekräftig genug. Der ALgorithmus nutzt ja keine Besonderheiten bestimmter Programmiersprachen aus! --2A02:8071:6400:A520:DD6A:C9B1:84AE:D137 19:40, 16. Nov. 2023 (CET)[Beantworten]