Java实现身份证号校验,最后一位校验码校验

中国居民身份证号码编码规则

第一、二位表示省(自治区、直辖市、特别行政区)。

第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。

第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。

第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。

第十五、十七位表示顺序码。对同地区、同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。

第十八位表示校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,校验码如果出现数字10,就用X来代替,详情参考下方计算方法。

  1. 其中第一代身份证号码为15位。年份两位数字表示,没有校验码。
  2. 前六位详情请参考省市县地区代码
  3. X是罗马字符表示数字10,罗马字符(1-12):Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ、Ⅺ、Ⅻ……,详情请参考罗马字符。

中国居民身份证校验码算法

步骤如下:

  1. 将身份证号码前面的17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  2. 将这17位数字和系数相乘的结果相加。
  3. 用加出来和除以11,取余数。
  4. 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。
  5. 通过上面计算得知如果余数是3,第18位的校验码就是9。如果余数是2那么对应的校验码就是X,X实际是罗马数字10。

Java实现身份证号校验,最后一位校验码校验_第1张图片

例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是合法的身份证。首先我们得出前17位的乘积和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

Java代码示例

public class Validator {
    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);
        }
    }
}

你可能感兴趣的:(JavaEE-综合,java,开发语言,Java实现身份证号校验,身份证号校验码计算)