新18位身份证号的结构是:六位数字地址码+八位数字出生日期码+三位数字顺序码+一位数字校验码
前17位都很好得到(前六位是地区行政编码,比如北京市是110000,其他请参考官方网站查询:www.stats.gov.cn/tjbz/index.htm 。八位出生日期要注意,比如你是1990年1月1日出生的,那么就是:19900101),关键也是此算法唯一的难点是最后一位校验码的计算。步骤如下:
1、将前17位数乘以不同的系数,系数对应表:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2、将前17位数加上上面的每个数相乘的结果
3、将上面的结果对11取余(范围:0 1 2 3 4 5 6 7 8 9 10)
4、将上面的余数参照对应表:1 0 X 9 8 7 6 5 4 3 2
上面的算法是从网上摘抄下来的,也是传的比较广的一个,姑且我就以这个算法为蓝本用Java表示出来喽!
[mw_shl_code=java,true]private static int[] multiNum=new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
private static String[] resNum=new String[]{"1","0","X","9","8","7","6","5","4","3","2"};
/**
* 输入参数返回身份河蟹证号码的方法
* @param addrNo 地区行政编码(6位)
* @param birthDate //出生日期(8位)
* @param orderCode 顺序码(3位数,男奇女偶)
* @return 身份河蟹证号码
*/
public static String getIDnumber(String addrNo,String birthDate,String orderCode){
String orderNumber="";//存放顺序码
String num17=addrNo+birthDate+orderCode;//拼接出前17个数字
char[] num17Ch=num17.toCharArray();//将前17字符串转成字符数组
int num17Tmp=0;//存放第二步的结果
for(int i=0;i<multiNum.length;i++){//将第一步和第二部合并
int num17ChTmp=Integer.parseInt(num17Ch+"");
num17Tmp+=(num17ChTmp+num17ChTmp*multiNum);
}
int oddNumber=num17Tmp%11;//第三步(对11取余)
for(int i=0;i<resNum.length;i++){//第四步(余数对象获得对应顺序码)
if(oddNumber==i){
orderNumber=resNum[i-1];//根据原算法不需要-1,但亲测多一位无奈此处减去1
}
}
return num17+orderNumber;//返回前17位字符串+顺序码
}[/mw_shl_code]
调用这个静态方法,传入三个字符串即可得到一个18位身份河蟹证号了。
以上的算法亲测貌似有一点的偏差,不过确实能生成一个有效的18位身份河蟹证号,对付网络注册还是绰绰有余啦!不信大家自己拿回去试试喽!
