Java代碼驗證18位身份證號碼是不是真的

身份證號碼很可能是瞎寫的,如何驗證?當然這裏說的驗證是指驗證這個身份證號碼是合法的號碼,但是不能驗證與其匹配的姓名是否合法。

規則如下:

公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次爲:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
1、地址碼(前六位數)
表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。
2、出生日期碼(第七位至十四位)
表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。
3、順序碼(第十五位至十七位)
表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
4、校驗碼(第十八位數)
(1)十七位數字本體碼加權求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先對前17位數字的權求和
Ai:表示第i位置上的身份證號碼數字值
Wi:表示第i位置上的加權因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)計算模
Y = mod(S, 11)
(3)通過模得到對應的校驗碼
Y: 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2

Java代碼如下:

int weight[]=new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        String strID="460028190001012452";
        int sum = 0;
        for(int i=0;i<strID.length()-1;i++){
            String ch=strID.substring(i , i+1);
            sum+=weight[i]*Integer.parseInt(ch);
        }
        System.out.println(""+sum%11);
        System.out.println("Y: 0 1 2 3 4 5 6 7 8 9 10\n校驗碼: 1 0 X 9 8 7 6 5 4 3 2 ");

當然可以用個switch語句將其比對就可以自動判斷了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章