身份证号规则校验
?我們國家目前公民身份證號為15位或者18位,且最后一位可能出現(xiàn)字母X。其中,
15位身份證為我國第一代身份證,基本已經(jīng)退出歷史舞臺。其規(guī)則如下:
前1、2位數(shù)字表示:所在省份的代碼;
第3、4位數(shù)字表示:所在城市的代碼;
第5、6位數(shù)字表示:所在區(qū)縣的代碼;
第7-12位數(shù)字表示:出生年(缺省18,19,20這種)、月、日;
第13-14位數(shù)字表示:出生順序編號;
第15位數(shù)字表示性別:奇數(shù)表示男性,偶數(shù)表示女性;
注:15位沒有X字母
18位身份證為我國第二代身份證,也就是目前我們使用的。其規(guī)則如下:
前1、2位數(shù)字表示:所在省份的代碼;
第3、4位數(shù)字表示:所在城市的代碼;
第5、6位數(shù)字表示:所在區(qū)縣的代碼;
第7-14位數(shù)字表示:出生年、月、日;
第15、16位數(shù)字表示:所在地的派出所的代碼;
第17位數(shù)字表示性別:奇數(shù)表示男性,偶數(shù)表示女性;
第18位數(shù)字是校檢碼:也有的說是個人信息碼,一般是隨計算機的隨機產(chǎn)生,用來檢驗身份證的正確性。根據(jù)本體碼,通過采用ISO 7064:1983,MOD 11-2校驗碼系統(tǒng)計算出校驗碼。算法可參考下文。前面有提到數(shù)字校驗碼,我們知道校驗碼也有X的,實質(zhì)上為羅馬字符X,相當(dāng)于10。
18位身份證號校驗碼生成規(guī)則:
將本體碼各位數(shù)字乘以對應(yīng)加權(quán)因子并求和,除以11得到余數(shù),根據(jù)余數(shù)通過校驗碼對照表查得校驗碼。
加權(quán)因子:
取余加權(quán)公式:
S= sum(Ai + Wi),i = 0,1,2 ....,16,對應(yīng)上表格1-17位置
Ai: 表示身份證上的1-17的數(shù)字
Wi: 表示上圖對應(yīng)的加權(quán)因子
取模公式:Y = mod(S,11)
取模后,余數(shù)對應(yīng)的校驗碼:
例:11010519491231002X
求最后一位校驗碼過程如下:
?校驗代碼如下(Java):
/*** 身份證號碼驗證* @param idCardNumber 身份證號碼* @return boolean*/ public static boolean isIdCardNumber(String idCardNumber) {if (idCardNumber == null || "".equals(idCardNumber)) {return false;}//正則表達(dá)式String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";boolean matches = idCardNumber.matches(regularExpression);//判斷第18位校驗值if (matches) {if (idCardNumber.length() == 18) {try {char[] charArray = idCardNumber.toCharArray();//前十七位加權(quán)因子int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};//這是除以11后,可能產(chǎn)生的11位余數(shù)對應(yīng)的驗證碼String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};int sum = 0;for (int i = 0; i < idCardWi.length; i++) {int current = Integer.parseInt(String.valueOf(charArray[i]));int count = current * idCardWi[i];sum += count;}char idCardLast = charArray[17];int idCardMod = sum % 11;if (idCardY[idCardMod].equals(String.valueOf(idCardLast).toUpperCase())) {return true;} else {return false;}} catch (Exception e) {log.error("身份證號規(guī)則校驗異常,err={}",e.getMessage());return false;}}}return matches; }總結(jié)
- 上一篇: 記録一次JDK 11下運行JavaFX(
- 下一篇: 滑模控制学习笔记(二)