字體:小 中 大 | |
|
|
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=6或8*2=16除以10餘數都是6!依此類推,4*4=16與9*4=36也可能造成類似的結果→辨識其實錯了,但驗證是可以通過的!所以啦!請記住「規則」驗證正確不是百分之百可以證明「辨識」正確與否的!我被嚇倒也學到了! |
|
( 心情隨筆|心情日記 ) |