網路城邦
上一篇 回創作列表 下一篇  字體:
台灣身分證的VB.NET驗證程式
2017/04/02 05:03:23瀏覽2869|回應0|推薦2

最近在作台灣身分證號碼辨識的程式,順便就分享一下這個驗證程式,規則可以參考這個網頁:

http://web.htps.tn.edu.tw/cen/other/files/pp/

程式碼:

    Private Function CheckSum(A As String) As Boolean

        If A.Length <> 10 Then Return False

        Dim K() As Char = A.ToCharArray

        Dim G() As Integer = {10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, _

            21, 22, 25, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}

        Dim m() As Char = Format(G(Asc(K(0)) - 65), "00").ToCharArray

        Dim Y As Integer = Val(m(0)) + Val(m(1)) * 9

        For i As Integer = 1 To 8

            Y += Val(K(i)) * (9 - i)

        Next

        Y += Val(K(9))

        If Y Mod 10 = 0 Then Return True 'Pass

        Return False 'Fail

    End Function

我會分享這個東西其實不是它特別難寫,而是我是等出了意外才驚覺它只能驗證「規則」正確,但不能保證驗證我的「辨識」正確!如下的字號:

B***293383

我的辨識程式誤將倒數第三個”3”字辨識錯誤為”8”字,居然還是驗證通過了!發現之後嚇了自己一大跳,因為我之前都是依據Checksum結果判斷正確與否的!這下知道不可靠了,急忙重跑程式,用肉眼再確認全部一百多張樣本的辨識結果是否正確?多忙了一兩小時。當然3與8的辨識錯誤原因也找到並解決了!我的辨識正確率仍然是百分之百的。

上例出錯原因在「Val(K(7)) * 2」這個檢驗片段,因為最終Y值如為10的倍數即可通過驗證,不論是3*2=68*2=16除以10餘數都是6!依此類推,4*4=169*4=36也可能造成類似的結果→辨識其實錯了,但驗證是可以通過的!所以啦!請記住「規則」驗證正確不是百分之百可以證明「辨識」正確與否的!我被嚇倒也學到了!

( 心情隨筆心情日記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=yccsonar&aid=99673497