- UID
- 171565
- 在线时间
- 0 小时
- 最后登录
- 2012-8-21
- 注册时间
- 2012-8-9
- 宅魂
- 131 点
- 贡献
- 42 点
- 宅币
- 273 枚
- 宅の石(入宅度)
- 0 块
- 元气(技能点)
- 5 点
- 活跃
- 0 ℃
- 听众
- 4
- 收听
- 0
该用户从未签到
Continue
- 积分
- 1092
|
新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位身份河蟹证号,对付网络注册还是绰绰有余啦!不信大家自己拿回去试试喽! |
评分
-
参与人数 3 | 宅魂 +1 |
宅币 +43 |
贡献 +2 |
元气(技能点) +1 |
活跃 +1 |
收起
理由
|
Mr_Alex
| + 1 |
+ 3 |
|
|
+ 1 |
o(* ̄▽ ̄*)ブ 发糖 |
氺菓
| |
+ 10 |
+ 1 |
|
|
我终于知道身份河蟹证的算法了嗯. |
风音洛洛
| |
+ 30 |
+ 1 |
+ 1 |
|
o(* ̄▽ ̄*)ブ 发糖 |
查看全部评分
|