Validarea unui CNP

Creat: 2010/mar       Revizuiri/Comentarii

perl | CNP

Î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;
}

Desigur, punând valid_cnp() să returneze $cifra_control - putem vedea că pentru "22..." cifra de control (ultima din CNP) trebuie să fie 5:

     vb@localhost:~$ ./validcnp.pl 2222222222225
     2222222222225 este CNP valid

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ă).

Media Dinamică

Drumuri

ŞahStartTemp

25
32
17
4
19
34
14
3
26
33
16
5
31
24
15
18
35
20
2
13
27
6
9
23
30
11
8
21
28
12
22
29
10
7

Localităţi

Judeţ:

Bliţuri

Load another random Bliţ

Linux şi aplicaţii Web
în 24 de ore

Orar şcolar
documentaţie Sphinx