1. 程式人生 > >身份證號碼生成與校驗

身份證號碼生成與校驗

style 山西 年份 組成 生成 rate rar div throws

  在測試過程中難免會遇到需要身份證號碼的情況,記錄下隨機生成身份證號碼與如何檢驗身份證號碼的方法。

  首先要了解身份證號碼的組成方式: 

  1. 號碼結構:公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
  2. 地址碼(前六位數):表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。
  3. 出生日期碼(第七位至十四位):表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。
  4. 順序碼(第十五位至十七位) :表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
  5. 校驗碼(第十八位數):校驗位

  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。

身份證號碼生成與校驗