În multe ţări este instituit câte un sistem numeric de identificare a cetăţenilor, National identification number; în România avem sistemul Cod Numeric Personal (CNP).
Pentru înscrierea unei persoane (nume, prenume, CNP) într-o bază de date, trebuie să folosim o funcţie de validare a valorii CNP. La free online Romanian national identification number se poate verifica un CNP - dar putem proba că validarea este incompletă:
2222222222225 a fost considerat "CNP VALID" (deşi este greşit) numai pe baza faptului că ultima cifră (cea "de control") este corectă: 2×(2+7+9+1+4+6+3+5+8+2+7+9) = 2×63 iar 126 % 11 == 5.
Programul următor (în Perl) descrie şi algoritmul de construire a cifrei de control:
#!/usr/bin/perl my $input_cnp = $ARGV[0]; print $input_cnp . " este CNP " . (valid_cnp($ARGV[0]) ? "valid\n" : "invalid\n"); sub valid_cnp { # verifică numai cifra de control (nu şi câmpul AALLZZ) my @cnp = split("", shift); return 0 if scalar @cnp != 13; my @k = (2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9); # şablonul de control CNP my $suma_control = 0; for (my $i = 0; $i < 12; $i++) { $suma_control += $cnp[$i] * $k[$i]; } my $cifra_control = $suma_control % 11; $cifra_control = 1 if $cifra_control == 10; return $cifra_control == $cnp[12]; # sau, return $cifra_control; }
Testarea cifrei de control este insuficientă pentru validarea CNP-ului; este necesară şi verificarea primelor 7 cifre: prima indică sexul (par/impar) dar şi secolul (XX, XIX, sau XXI), iar următoarele patru AALLZZ indică anul, luna şi ziua naşterii (iar valoarea AA trebuie corelată cu prima cifră).
vezi Cărţile mele (de programare)