Prüfungen erwarte bis zuletzt. – Johann Wolfgang von Goethe
Vor kurzen bekam ich eine Aufgabenstellung. Bei einer Datenmigration stellte sich heraus, dass in einem Eingabefeld durch Fehlinterpretationen, einige Anwender AHV-Nummern erfassten. Aus Gründen des Datenschutzes mussten diese entfernt werden. Als Vorschlag kam die Idee auf, dass der Beginn der Nummer und die Länge überprüft werden sollte. Mich interessierte der genaue Aufbau und wie diese validiert werden kann. Also schaute ich bei bsv.admin.ch nach.
Die ersten drei Stellen sind der Code für die Schweiz. Ein Blick auf Wikipedia zeigte mir, dass hierfür die Kodierliste nach ISO 3166-1 zur Anwendung kommt. Bei den Ziffern von der vierten bis zur zwölften Position handelt es sich um eine Zufallszahl. Bei der letzten Zahl um eine Prüfziffer.
Wie wird nun die Prüfziffer berechnet?
Bei der weiteren Recherche stiess ich auf die European Article Number ehemals EAN-13. Die Ermittlung bzw. Berechnung der Prüfziffer kommt auch bei der Schweizer AHV Nummer zum Einsatz.
Die Regeln sind folgende:
- Die einzelnen Ziffern werden von rechts nach links, beginnend mit der vorletzten Ziffer, dass heisst ohne die Prüfziffer, abwechselnd die geraden Positionen mit 3 und die ungeraden Positionen mit 1 multipliziert und die Quersumme gebildet.
- Die Prüfziffer ergänzt diese Summe dann zum nächsten Vielfachen von 10.
European Article Number, ein bisschen speziell, wenn man einen Bezug ableiten will…
Rechnen wir mit diesen Informationen das obige Beispiel durch:
- Die Ziffern an den ungeraden Positionen sind: 8 + 6 + 4 + 2 + 6 + 7 macht eine Quersumme von 33. Die Multiplikation mit 1 erspare ich mir.
- Die Ziffern an den geraden Positionen sind 9 * 3 + 7 * 3 + 5 * 3 + 3 * 3 + 1 * 3 + 5 * 3, das macht eine Quersumme von 90
- 90 + 33 ergeben 123. Um auf das nächste vielfache von 10 zu kommen benötigt es die 7. Sieben ist die Prüfziffer und beendet die AHV Nummer.
Unsere erste Idee bestand darin, den Inhalt zwei Prüfungen zu unterziehen. Die Nummer beginnt mit 756 und die Eingabe ist 16 Zeichen lang. Ein Blick auf die Daten veranlasste uns in dem Projekt aber dazu, die Prüfung mittels der Quersumme vorzunehmen, damit wir einerseits alle kreativen Eingabekombinationen der AHV Nummer abdecken konnten und korrekte Eingaben nicht fälschlicherweise anonymisierten.
Die Implementierung in C# ist folgendermassen:
private bool Validate(string ahv) { int sum = 0; int pruefsumme = int.Parse(ahv[ahv.Length - 1].ToString()); for (int i = ahv.Length - 2; i >= 0; i--) { var n = int.Parse(ahv[i].ToString()); sum += (i % 2 == 0) ? n : n * 3; } return (sum + pruefsumme) % 10 == 0; }
Gültige AHV Nummern liessen sich so, trotz kreativer Kombinationen, ermitteln und aus dem Datenset entfernen. Nebenbei weiss ich nun wie die Schweizer Artikel ähhh AHV Nummer auf Gültigkeit geprüft werden kann.