momente şi schiţe de informatică şi matematică
To attain knowledge, write. To attain wisdom, rewrite.

Validarea unui CNP

CNP | perl
2010 mar

Î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)

docerpro | Prev | Next