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.
Approfondimenti
I più letti di oggi
- Effettuare il download di un file via FTP con la libreria FluentFTP di .NET
- Debug di app .NET tramite snapshot con Application Insight
- Utilizzare le Fullscreen API di HTML5 in IE11
- Proteggere l'accesso ad una Azure Web e API App tramite Google
- Utilizzare .NET Core con le Azure Function
- Effettuare il redirect da HTTP a HTTPS con la Azure CDN
- Creare un package MTS con uno script ASP
- Autenticazione con Minimal API di ASP.NET Core 6
- Routing HTTP con i proxy delle Azure Function
- Convidere una share di rete tra VM di Azure