Per verificare velocemente un codice fiscale, si può ricorrere all'ultimo carattere dello stesso, chiamato Carattere di Controllo.
Tale carattere corrisponde al Resto della divisione per 26 della somma dei valori dei caratteri in posizione pari sommato alla somma dei valori dei caratteri in posizione dispari.
I valori dei caratteri vengono rilevati dalla Tabella di corrispondenza, nel nostro esempio la matrice Lettere, che contiene nella prima colonna le lettere dell'alfabeto e i numeri, nella seconda il loro valore se sono in posizione pari e nella terza il loro valore se sono in posizione dispari.
Il funzionamento è semplice: dopo aver sommato i corrispettivi valori dei 15 caratteri relativi ai dati dell'utente(Nome, Cognome, sesso, anno e luogo di nascita), divido il risultato per 26, ottenendo così un resto che sarà sempre compreso tra 0 e 25. In questo modo al valore del resto, posso associare una lettera dell'alfabeto inglese (0=A, 1=B, ...) ottenendo così il sedicesimo carattere del Codice Fiscale.
Tengo a precisare che in realtà non si ha l'assoluta certezza dell'esattezza ma per avere quella dovremmo prendere
tutto il database dei comuni italiani per avere tutti i codici e ricrearci il Cod. Fisc. per intero, partendo
dai dati forniti dall'utente e dalle istruzioni del ministero della finanza.
Non si ha l'assoluta certezza dell'estattezza perché esistono quelle che i matematici (e non solo loro) chiamano permutazioni: per farla breve, se io scambio tra di loro due lettere che hanno la stessa posizione (o entrambe pari, o entrambe dispari) il risultato della somma non cambia e quindi il Cod.Fisc. risulta corretto.
Ad esempio PLLFBO può diventare LLPFBO avendo scambiato la prima e terza lettera e poi ancora LFPLBO e poi LFPOBL.
Un miglioramento del codice può essere l'aggiunta dell'algoritmo che partendo dal nome e cognome, calcola anche le prime 6 lettere e le confronta con quelle del Cod. Fisc. inserito.
<% CodiceFiscale = 'valorizzare qui Dim Lettere(35,2) Dim ConfrontoCarattereControllo(25) Dim I Dim J Dim Carattere Dim ValorePari Dim ValoreDispari Dim SommaCaratteri Dim PariDispari Dim Risultato Dim CarattereControllo Dim Temp Dim Test Lettere(0,0) = "A" Lettere(0,1) = "0" Lettere(0,2) = "1" Lettere(1,0) = "B" Lettere(1,1) = "1" Lettere(1,2) = "0" Lettere(2,0) = "C" Lettere(2,1) = "2" Lettere(2,2) = "5" Lettere(3,0) = "D" Lettere(3,1) = "3" Lettere(3,2) = "7" Lettere(4,0) = "E" Lettere(4,1) = "4" Lettere(4,2) = "9" Lettere(5,0) = "F" Lettere(5,1) = "5" Lettere(5,2) = "13" Lettere(6,0) = "G" Lettere(6,1) = "6" Lettere(6,2) = "15" Lettere(7,0) = "H" Lettere(7,1) = "7" Lettere(7,2) = "17" Lettere(8,0) = "I" Lettere(8,1) = "8" Lettere(8,2) = "19" Lettere(9,0) = "J" Lettere(9,1) = "9" Lettere(9,2) = "21" Lettere(10,0) = "K" Lettere(10,1) = "10" Lettere(10,2) = "2" Lettere(11,0) = "L" Lettere(11,1) = "11" Lettere(11,2) = "4" Lettere(12,0) = "M" Lettere(12,1) = "12" Lettere(12,2) = "18" Lettere(13,0) = "N" Lettere(13,1) = "13" Lettere(13,2) = "20" Lettere(14,0) = "O" Lettere(14,1) = "14" Lettere(14,2) = "11" Lettere(15,0) = "P" Lettere(15,1) = "15" Lettere(15,2) = "3" Lettere(16,0) = "Q" Lettere(16,1) = "16" Lettere(16,2) = "6" Lettere(17,0) = "R" Lettere(17,1) = "17" Lettere(17,2) = "8" Lettere(18,0) = "S" Lettere(18,1) = "18" Lettere(18,2) = "12" Lettere(19,0) = "T" Lettere(19,1) = "19" Lettere(19,2) = "14" Lettere(20,0) = "U" Lettere(20,1) = "20" Lettere(20,2) = "16" Lettere(21,0) = "V" Lettere(21,1) = "21" Lettere(21,2) = "10" Lettere(22,0) = "W" Lettere(22,1) = "22" Lettere(22,2) = "22" Lettere(23,0) = "X" Lettere(23,1) = "23" Lettere(23,2) = "25" Lettere(24,0) = "Y" Lettere(24,1) = "24" Lettere(24,2) = "24" Lettere(25,0) = "Z" Lettere(25,1) = "25" Lettere(25,2) = "23" Lettere(26,0) = "0" Lettere(26,1) = "0" Lettere(26,2) = "1" Lettere(27,0) = "1" Lettere(27,1) = "1" Lettere(27,2) = "0" Lettere(28,0) = "2" Lettere(28,1) = "2" Lettere(28,2) = "5" Lettere(29,0) = "3" Lettere(29,1) = "3" Lettere(29,2) = "7" Lettere(30,0) = "4" Lettere(30,1) = "4" Lettere(30,2) = "9" Lettere(31,0) = "5" Lettere(31,1) = "5" Lettere(31,2) = "13" Lettere(32,0) = "6" Lettere(32,1) = "6" Lettere(32,2) = "15" Lettere(33,0) = "7" Lettere(33,1) = "7" Lettere(33,2) = "17" Lettere(34,0) = "8" Lettere(34,1) = "8" Lettere(34,2) = "19" Lettere(35,0) = "9" Lettere(35,1) = "9" Lettere(35,2) = "21" For I = 0 To 25 ConfrontoCarattereControllo(I) = Chr(65 + I) 'creo in ConfrontoCarattereControllo tutte le lettere maiuscole dalla A (chr(65)) alla Z(chr(90)) Next Carattere=0 ValorePari=1 'indice della seconda colonna della matrice Lettere ValoreDispari=2 'indice della terza colonna della matrice Lettere SommaCaratteri=0 CarattereControllo=Right(CodiceFiscale,1) for I=1 to len(CodiceFiscale)-1 if (I mod 2)=0 then PariDispari="P" else PariDispari="D" end if Temp =mid(CodiceFiscale,I,1) J=0 do Test=Lettere(J,Carattere) J=J+1 loop until Temp=Test J=J-1 if PariDispari="P" then SommaCaratteri=SommaCaratteri + CInt(Lettere(J,ValorePari)) else SommaCaratteri=SommaCaratteri + CInt(Lettere(J,ValoreDispari)) end if Next Risultato=SommaCaratteri mod 26 Risultato=ConfrontoCarattereControllo(Risultato) if Risultato<>CarattereControllo then Response.write "Si è verificato un errore" else Response.write "CodiceFiscale: " & Risultato end if %>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.