Skip to content

Latest commit

 

History

History
55 lines (43 loc) · 2.28 KB

计算身份证校验码.md

File metadata and controls

55 lines (43 loc) · 2.28 KB

计算校验码

身份证号与权重的对应表

号码 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

计算公式

  1. 身份证每一位号码与其对应的权重,使用当前位上的数字和对应的权重 相乘,并将十七位计算的数字求和
  2. 将第一步求和的结果,除以 11取余
  3. 参照余数与校验码对照表获取真实的校验码。
  4. 将计算的校验码对用户输入的第十八位进行对比,一致则身份证号正确。

代码

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];
    }

}