身份證號碼生成與校驗
阿新 • • 發佈:2017-08-21
style 山西 年份 組成 生成 rate rar div throws
在測試過程中難免會遇到需要身份證號碼的情況,記錄下隨機生成身份證號碼與如何檢驗身份證號碼的方法。
首先要了解身份證號碼的組成方式:
- 號碼結構:公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
- 地址碼(前六位數):表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。
- 出生日期碼(第七位至十四位):表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。
- 順序碼(第十五位至十七位) :表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
- 校驗碼(第十八位數):校驗位
18位身份證就是如上構成,15位身份證缺少的年份兩位數和最後一位校驗碼。
要生成身份證號碼首先得確定 地址碼和出生日期碼也可以按照規定隨機抽取,順序碼自己使用函數隨機生成一個2位數的碼值。校驗碼通過計算得到。
比如現有山西 陽泉市 市轄區的地址碼140301 ,出生日期碼19920101和隨機生成的888順序碼。其校驗碼的生成代碼如下
/** * @Title generateId * @Descript :計算身份證的校驗位並返回完整的18位身份證 * @param:前17位碼值 * @return 前17位碼值+校驗位 *@throws * @version V1.0 */ public String generateId(String param) { char[] chars=param.toCharArray(); int result=0; for(int i=0;i<chars.length;i++){ result+=Integer.parseInt(String.valueOf(chars[i]),10)*(Math.pow(2,chars.length-i)%11); } result=result%11; result=result==0?1:result==1?0:12-result; return result==10?param+"X":param+result; }
其中校驗碼的計算規則如下:假設身份證號碼前17位是一個17個長度的數組a[17],i表示第i位,從0開始計數直到16。那麽
a[i]乘以(2的i 次方除以11的余數)在累加計算出來的值result,最後校驗位就是12-累加的值除以11的余數。需要註意的是如果校驗位計算出來是12那麽就要替換成1,如果是11就要替換成0,如果是10就替換成X。
身份證號碼生成與校驗