Java身份证号码校验位计算
介绍
身份证号码是中国居民的唯一标识,由18位数字组成。其中,前17位为身份证号码的主体部分,最后一位为校验位。校验位的计算方法是根据前17位的数字进行运算得出的一个数字,用于验证身份证号码是否合法。本篇文章将介绍如何使用Java编写一个身份证号码校验位计算的程序,并对计算过程进行详细说明。
计算校验位的方法
计算身份证号码的校验位需要依赖一组数字权重和取模运算。具体的计算方法如下:
-
将身份证号码的前17位数字分别乘以对应的权重,权重的计算公式为:$$weight = 2^{i-1} \mod 11$$其中,i表示数字的位置,从左往右依次为1到17。
位置 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 权重 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 -
将上一步得到的结果求和,得到一个总和值sum。
-
将sum除以11取余数remainder,即sum % 11。
-
根据余数的值,查找对应的校验位,并将其作为身份证号码的最后一位。
余数 校验位 1 1 2 X 3 9 4 8 5 7 6 6 7 5 8 4 9 3 10 2
Java代码示例
下面是使用Java编写的一个身份证号码校验位计算的示例代码:
public class IDCardValidator {
private static final int[] WEIGHTS = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
public static boolean validate(String idCardNumber) {
if (idCardNumber.length() != 18) {
return false;
}
int sum = 0;
for (int i = 0; i < 17; i++) {
char c = idCardNumber.charAt(i);
if (!Character.isDigit(c)) {
return false;
}
int digit = c - '0';
sum += digit * WEIGHTS[i];
}
int remainder = sum % 11;
char expectedCheckDigit = getCheckDigit(remainder);
char actualCheckDigit = idCardNumber.charAt(17);
return expectedCheckDigit == actualCheckDigit;
}
private static char getCheckDigit(int remainder) {
switch (remainder) {
case 0:
return '1';
case 1:
return '0';
case 2:
return 'X';
case 3:
return '9';
case 4:
return '8';
case 5:
return '7';
case 6:
return '6';
case 7:
return '5';
case 8:
return '4';
case 9:
return '3';
case 10:
return '2';
default:
throw new IllegalArgumentException("Invalid remainder: " + remainder);
}
}
}
上述代码中,validate
方法接收一个身份证号码作为参数,返回一个布尔值,表示该身份证号码是否合法。代码首先检查身份证号码的长度是否为18位,如果不是,则直接返回false。然后,使用循环遍历前17位数字,根据权重计算出一个总和值sum。最后,通过求余数和查找校验位的