我国第二代公民身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。本文只介绍最后一位数字校验码的计算校验。
校验码算法
将本体码各位数字乘以对应加权因子并求和,除以11得到余数,根据余数通过校验码对照表查得校验码。
加权因子:
校验码:
算法举例:
本体码为:11010519491231002
第一步: 各位数与对应加权因子乘积求和1*7+1*9+0*10+1*5+***=167
第二步:对求和进行除11得余数167%11=2
第三步:根据余数2对照校验码得X
因此完整身份证号为:11010519491231002X
代码实现
由校验码算法,我自己写了以下代码
public class TimTest {
// Java实现18位身份证号码的校验码计算校验
public static void main(String[] args) {
// 从百度百科中找到的身份证号码例子
String idCard = "53010219200508011X";
System.out.println(idCardVerify(idCard) ? "身份证号码校验通过" : "身份证号码不合法");
}
static boolean idCardVerify(String idCard) {
// 仅适用于18位标准身份证号码
if (idCard.length() != 18) {
return false;
}
// 使身份证号码中的字母升大写
idCard = idCard.toUpperCase();
char[] idCardChars = idCard.toCharArray();
// 重点1:加权因子计算
final int[] factors = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int sumFactor = 0;
for (int i = 0; i < factors.length; i++) {
// 数字的ASCII码是48-57
int value = idCardChars[i] - 48;
// 纯数字校验
if (value < 0 || value > 9) {
return false;
}
sumFactor += factors[i] * value;
}
// 重点2:校验码比对
final char[] verifyCode = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
// author: tiange1314520@qq.com
return idCardChars[17] == verifyCode[sumFactor % 11];
}
}
创作不易,觉得有用请给我点个赞吧!