身份证校验规则

昨天看到了李永乐老师的视频,史上最靓身份证号
拿220202022002020022为例:
1. 前6位 220202为地区编码,22为吉林身,02为吉林市,02为昌邑区
2. 中间8位是出生日期
3. 接着的3位是顺序码,第17位奇偶分别代码男女
4. 最后一位是校验码, 取值为0-9,X。

校验码类似于CRC校验码这种东西,其值需要满足一定的公式


\displaystyle \sum^{18}_{i = 0}{a_i w_i} \equiv 1 (mod 11)

w_i=2^{i-1} mod11


意思是,ai和wi的乘积的和与1对于11同余
wi是2^(i-1)对11取余

ai220202022002020022
wi79105842163791058421


 

 

校验代码如下:

private boolean checkId(String id){
        char[] chars = id.toCharArray();
        int[] ints = new int[18];
        for (int i = 0; i < chars.length; i++) {
            if(chars[i] == 'X' || chars[i] == 'x'){
                ints[i] = 10;
            }else{
                ints[i] = chars[i] - 48;
            }
        }
        List<Integer> aiList = IntStream.of(ints).boxed().collect(Collectors.toList());
        AtomicInteger index = new AtomicInteger();
        List<Integer> wiList = IntStream.of(ints).map(i ->  (int) Math.pow(2, 18 - index.incrementAndGet()) % 11)
                .boxed()
                .collect(Collectors.toList());
        int sum = IntStream.range(0, aiList.size())
                .map(i -> aiList.get(i) * wiList.get(i))
                .sum();
        return sum % 11 == 1;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值