Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#20

Re: Personalausweisnummer generieren

  Alt 24. Jul 2007, 12:23
Hallo,

ich hatte gestern scheinbar fortgesetzt massive Konzentrationsprobleme beim Lesen der Beispieltabelle auf der angegebenen Referenzseite, deshalb hier eine Korrektur meiner Funktion aus Beitrag #6. Dass ich nicht aufmerksamer gelesen hatte, lag übrigens daran, dass meine ersten (fehlerhaften) Funktionen mit den mir zur Verfügung stehenden Testdaten zufällig das richtige Ergebnis produzierten.

Delphi-Quellcode:
function ValidIdCardNumber(const s: string): Boolean;
var
  i, iSkip, iWeight, iSum: Integer;
begin
  Result := Length(s) = 36;
  if not Result then Exit;
  iSum := 0;
  iSkip := 0;
  for i := 1 to 35 do
  begin
    iWeight := Pred(2 shl (2 - Pred(i - iSkip) mod 3));
    if s[i] in ['0'..'9']
      then Inc(iSum, (Ord(s[i]) - Ord('0')) * iWeight)
      else Inc(iSkip);
  end;
  Result := iSum mod 10 = Ord(s[36]) - Ord('0');
end;
Die Berechnung des korrekten Gewichtes ist etwas undurchsichtig und entspringt einfach der Beobachtung, dass wenige triviale Abbildungen von (0,1,2) über (8,4,2) nach (7,3,1) führen. Ein vorbelegter Vektor à la MaBuSE ist da letzten Endes die bessere Lösung. Das sollte aber auch die einzige schwer nachvollziehbare Stelle in meiner Funktion sein.

Verlegene Grüße vom marabu
  Mit Zitat antworten Zitat