Utils 身份证号

生成一定数量的身份证号码用于测试

import java.util.*;
public class Main {
    public static void main(String[] args) {
        //获取n个身份证号,方便测试
        //现在的身份证号的第18位使用的是**ISO 7064:1983.MOD11-2**校验码计算法获取的
        // 返回一个0~(指定数-1)之间的随机值
        //校验值  好像不太对 没有使用
        //char[] verifyValue = new char[]{'1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'};
        //加权因子
        int[]   weightingFactor = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        int j = 0;
        while (true){
            //测试用 身份证号{5,1,0,7,2,3,1,9,9,4,1,2,0,9,2,8,7} 18位为 4
            int[] cardId = new int[17];
            StringBuilder sb = new StringBuilder(18);
            for(int i=0;i<cardId.length;i++){
                Random random = new Random();
                int ran = random.nextInt(10);
                sb.append(ran);
                cardId[i] = ran;
            }
            //计算17位数字各位数字与对应的加权因子的乘积的和s
            int s  = 0;
            for(int h = 0 ;h<cardId.length;h++){
                s =  s+cardId[h]*weightingFactor[h];
            }
            //计算s÷11的余数t
            int t = s%11;
            //获取校验码
            //int wf = verifyValue[t]; 
            //计算(12-T)÷11的余数r
            int r = (12-t)%11;
            if (10 == r){
                sb.append('X');
            }else{
                sb.append(r);
            }
            //生成的 身份证件号:
            //System.out.println(cardId.length);
            System.out.println(sb.toString());
            //生成多少个
            j++;
            //生成10000个
            if (j==10000){
                break;
            }

        }

    }
}

校验身份证的工具类

//现在的身份证号的第18位使用的是**ISO 7064:1983.MOD11-2**校验码计算法 校验的
public static boolean idCardVer(String idCard18) {
        //待验证身份证不能为空, 且长度为18
        if (StringUtils.isEmpty(idCard18) || (idCard18 = idCard18.trim()).length() != 18){
            return false;
        }

        //加权因子
        int[] weightingFactor = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        int[] cardId = new int[17];
        for (int i = 0; i < cardId.length; i++) {
            int ran = Integer.valueOf(idCard18.substring(i, i + 1));
            cardId[i] = ran;
        }
        //计算17位数字各位数字与对应的加权因子的乘积的和s
        int s = 0;
        for (int h = 0; h < cardId.length; h++) {
            s = s + cardId[h] * weightingFactor[h];
        }
        //计算s÷11的余数t
        int t = s % 11;

        //计算(12-T)÷11的余数r
        int r = (12 - t) % 11;

        String num18 = idCard18.substring(17, 18);
        System.out.println(num18);
        System.out.println(r);
        if (10 == r && "x".equalsIgnoreCase(num18)) {
            return true;
        } else if (r >= 0 && r <= 9 && String.valueOf(r).equals(num18)) {
            return true;
        }else {
            return false;
        }
    }
posted @ 2021-10-27 17:47  那年长安  阅读(69)  评论(0)    收藏  举报