身份证号与权重的对应表
号码 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
权重 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 校验码 |
余数与校验码对应表
余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
计算公式
- 身份证每一位号码与其对应的权重,使用当前位上的数字和对应的权重 相乘,并将十七位计算的数字求和。
- 将第一步求和的结果,除以 11,取余。
- 参照余数与校验码对照表获取真实的校验码。
- 将计算的校验码对用户输入的第十八位进行对比,一致则身份证号正确。
public class IDCardValidate {
// 每一位号码的权重
private static final int[] WEIGHT = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 最后一位身份证号码
private static final String[] VALICATION_NUMBER = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
/**
* 计算身份证最后一位校验码
* @param idCard
* @return null:获取校验码错误
*/
public static String computeValidationCode(String idCard) {
String[] idNums;
if (idCard == null || "".equalsIgnoreCase(idCard.trim()) || (idNums = idCard.split("")).length != 18) {
return null;
}
// 第一步,计算每一位身份证号和对应数字的总和
int sum = 0;
for (int i = 0; i < WEIGHT.length; i++) {
sum += (Integer.parseInt(idNums[i]) * WEIGHT[i]);
}
// 计算最后一位校验数字的下标
int index = sum % 11;
// 计算最后一位字符
return VALICATION_NUMBER[index];
}
}