身份證號碼驗證演算法
阿新 • • 發佈:2019-01-25
驗證身份證號碼的正確性,不能僅僅通過正則表示式來驗證,更不想花錢去買某些網站的API來進行驗證,因此蒐集各大網路驗證方法。總結如下:
我們都知道我國的身份證一共是18位,由十七位數字本體碼和一位校驗碼組成。
其排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位校驗碼。
1、地址碼
表示編碼物件常住戶口所在縣(市、旗、區)的行政區域劃分程式碼,按GB/T2260的規定執行。
2、出生日期碼
表示編碼物件出生的年、月、日,按GB/T7408的規定執行,年、月、日程式碼之間不用分隔符。
3、順序碼
表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
4、校驗碼計算步驟
(1)十七位數字本體碼加權求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先對前17位數字的權求和
Ai:表示第i位置上的身份證號碼數字值(0~9)
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加權因子)
(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
對應的程式碼校驗如下:
public class IdentityCard{
int [] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //十七位數字本體碼權重
char[] valid={ '1','0','X','9','8','7','6','5','4','3','2'}; //mod11,對應校驗碼字元值
///card是除去最後一位前17位的號碼
public char getValidateCode(String card){
int sum=0;
int mode=0;
for(int i=0;i<card.length();i++){
sum=sum+Integer.parseInt(String.valueOf(card.charAt(i)))*weight[i];
}
mode=sum%11 ;
return valid[mode];
}
}
說明
1.程式可以根據已有的17位數字本體碼,獲取對應的驗證碼。
2.該程式可以剔除驗證碼不正確的身份證號碼。
3.15位的身份證出生年份採用年份後2位,沒有最後1位校驗碼。
4.完整的身份證18位,最後一位校驗位可能是非數字。