批量生成二代身份证号码

    /*
    * 批量生成注册数据
    * */
    public void doImportSigner() throws ClassNotFoundException, SQLException, UnsupportedEncodingException {
        int batchSize = 100;
        int commitSize = 20;
        String sql = "insert into t_signer(userName,password,confirmPassWord,rand,trueName,sex,idNumber) value(?,?,?,?,?,?,?)";
        Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.30.63:3306/xmferry?rewriteBatchedStatements=true&characterEncoding=utf-8&useUnicode=true", "root",
                "root");
        conn.setAutoCommit(false);
        PreparedStatement pstmt =conn.prepareStatement(sql);


        for (int i=0;i<batchSize;i++){
//            制造数据
            String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890";

//            随机验证码
            String yzm = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
            Random random = new Random();
            String n = "1234567890";
            String firstName
                    = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏" +
                    "水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷" +
                    "贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛" +
                    "汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵席季麻强贾路娄危" +
                    "江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘缪干解应宗宣丁" +
                    "贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄魏加封芮羿储靳汲邴糜松井段" +
                    "富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭厉戎祖武符刘姜詹束龙叶幸司" +
                    "韶郜黎蓟薄印宿白怀蒲台从鄂索咸籍赖卓蔺屠蒙池乔阴郁胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰" +
                    "郦雍却璩桑桂濮牛寿通边扈燕冀郏浦尚农温别庄晏柴瞿阎充慕连茹习宦艾鱼容向古易慎戈廖庚终暨" +
                    "居衡步都耿满弘匡国文寇广禄阙东殴殳沃利蔚越夔隆师巩厍聂晁勾敖融冷訾辛阚那简饶空曾毋沙乜养鞠" +
                    "须丰巢关蒯相查后江红游竺权逯盖益桓公万俟司马上官欧阳夏侯诸葛闻人东方赫连皇甫尉迟公羊澹台公" +
                    "冶宗政濮阳淳于仲孙太叔申屠公孙乐正轩辕令狐钟离闾丘长孙慕容鲜于宇文司徒司空亓官司寇仉督子车" +
                    "颛孙端木巫马公西漆雕乐正壤驷公良拓拔夹谷宰父谷粱晋楚阎法汝鄢涂钦段干百里东郭南门呼延归海羊" +
                    "舌微生岳帅缑亢况后有琴梁丘左丘东门西门商牟佘佴伯赏南宫墨哈谯笪年爱阳佟第五言福百家姓续";

            String secondName
                    = "计伏成戴谈宋茅庞熊纪屈项祝董杜阮" +
                    "蓝闵席季麻强贾路娄危江童颜郭刚勇毅俊峰强军平保东文辉力明" +
                    "永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清" +
                    "飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮" +
                    "会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之" +
                    "轮翰朗伯宏言若鸣朋斌梁" +
                    "栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风梅盛" +
                    "林刁钟徐邱骆高夏蔡田樊胡凌霍虞万" +
                    "支柯咎管卢莫经房裘缪干解应宗宣丁" +
                    "贲邓郁单杭洪包诸左石崔吉钮龚程嵇" +
                    "邢滑裴陆荣翁荀羊於惠甄加封芮羿储秀娟英华慧巧美娜静淑惠珠翠" +
                    "雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月" +
                    "莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷" +
                    "姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦" +
                    "岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥" +
                    "筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽";

//            密码
            String password = "";
            StringBuffer stringBuffer1 = new StringBuffer();
            for (int j = 0; j < 6; j++) {
                String p = String.valueOf(n.charAt(random.nextInt(n.length())));
                stringBuffer1.append(p);
            }
            password = stringBuffer1.toString();

//            身份证
            // 18位身份证号码各位的含义:
            // 1-2位省、自治区、直辖市代码;
            // 3-4位地级市、盟、自治州代码;
            // 5-6位县、县级市、区代码;
            // 7-14位出生年月日,比如19670401代表1967年4月1日;
            // 15-17位为顺序号,其中17位(倒数第二位)男为单数,女为双数;
            // 18位为校验码,0-9和X。
            // 作为尾号的校验码,是由把前十七位数字带入统一的公式计算出来的,
            // 计算的结果是0-10,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,
            // 因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的10,用X来代替10
            /**
             * 身份证15位编码规则:dddddd yymmdd xx p
             * dddddd:地区码
             * yymmdd: 出生年月日
             * xx: 顺序类编码,无法确定
             * p: 性别,奇数为男,偶数为女
             * <p />
             * 身份证18位编码规则:dddddd yyyymmdd xxx y
             * dddddd:地区码
             * yyyymmdd: 出生年月日
             * xxx:顺序类编码,无法确定,奇数为男,偶数为女
             * y: 校验码,该位数值可通过前17位计算获得
             * <p />
             * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
             * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
             * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
             * i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
             *
             */

            // 随机生成省、自治区、直辖市代码 1-2
            String provinces[] = { "11", "12", "13", "14", "15", "21", "22", "23",
                    "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
                    "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",
                    "63", "64", "65", "71", "81", "82" };
            String province = randomOne(provinces);
            // 随机生成地级市、盟、自治州代码 3-4
            String city = randomCityCode(18);
            // 随机生成县、县级市、区代码 5-6
            String county = randomCityCode(28);
            // 随机生成出生年月 7-14
            String birth = randomBirth(20, 50);
            // 随机生成顺序号 15-17(随机性别)
            String no = new Random().nextInt(999) + "";
            int noi = Integer.parseInt(no);
            if (noi < 100) {
                no = "0"+ no ;
            }
            //计算校验码
            String checks[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                    "X" };
            String check = randomOne(checks);
            String s17 = province+city+county+birth+no;
            int S = (Integer.parseInt(String.valueOf(s17.charAt(0))) + Integer.parseInt(String.valueOf(s17.charAt(10)))) * 7
                    + (Integer.parseInt(String.valueOf(s17.charAt(1))) + Integer.parseInt(String.valueOf(s17.charAt(11)))) * 9
                    + (Integer.parseInt(String.valueOf(s17.charAt(2))) + Integer.parseInt(String.valueOf(s17.charAt(12)))) * 10
                    + (Integer.parseInt(String.valueOf(s17.charAt(3))) + Integer.parseInt(String.valueOf(s17.charAt(13)))) * 5
                    + (Integer.parseInt(String.valueOf(s17.charAt(4))) + Integer.parseInt(String.valueOf(s17.charAt(14)))) * 8
                    + (Integer.parseInt(String.valueOf(s17.charAt(5))) + Integer.parseInt(String.valueOf(s17.charAt(15)))) * 4
                    + (Integer.parseInt(String.valueOf(s17.charAt(6))) + Integer.parseInt(String.valueOf(s17.charAt(16))))* 2
                    + (Integer.parseInt(String.valueOf(s17.charAt(7)))) * 1
                    + (Integer.parseInt(String.valueOf(s17.charAt(8)))) * 6
                    + (Integer.parseInt(String.valueOf(s17.charAt(9)))) * 3;
            int Y = S%11;
            String M = "F";
            String JYM ="10X987654321";
            M = JYM.substring(Y,Y+1);


            // 拼接身份证号码
            String idNumber=province+city+county+birth+no+M;

//            用户名
            StringBuffer stringBuffer = new StringBuffer();
            String userName = "";
            int uNl = (int) (Math.random()*20+6);
            if (uNl < 6 || uNl > 30) {
                uNl = 10;
            }
            for (int c =0; c<uNl;c++) {
                String p = String.valueOf(s.charAt(random.nextInt(s.length())));
                stringBuffer.append(p);
            }

            userName = stringBuffer.toString();
//          验证码
            StringBuffer stringBuffer2 = new StringBuffer();
            String yanzm = "" ;
            for (int l = 0; l < 4; l++) {
                String p = String.valueOf(yzm.charAt(random.nextInt(yzm.length())));
                stringBuffer2.append(p);
            }
            yanzm=stringBuffer2.toString();

//            姓名
            String trueName = String.valueOf(firstName.charAt(random.nextInt(firstName.length()))) +
                    String.valueOf(secondName.charAt(random.nextInt(secondName.length())))+
                    String.valueOf(secondName.charAt(random.nextInt(secondName.length())));

//            性别
            int gender = Integer.parseInt(idNumber.substring(16, 17));
            String sex = "";
            if (gender% 2 != 0) {
                sex = "男";
            } else {
                sex = "女";
            }
//            中文乱码问题
//            trueName = new String(trueName.getBytes(),"ISO8859_1");
//            sex = new String(sex.getBytes(),"ISO8859_1");

            pstmt.setString(1,userName);
            pstmt.setString(2,password);
            pstmt.setString(3,password);
            pstmt.setString(4,yanzm);
            pstmt.setString(5,trueName);
            pstmt.setString(6,sex);
            pstmt.setString(7,idNumber);
            pstmt.execute();


            if (i % commitSize == 0 ){
                conn.commit();
            }
        }
        conn.commit();

    }

    /**
     * 从String[] 数组中随机取出其中一个String字符串
     *
     * @author mingzijian
     * @param s
     * @return
     */
    public String randomOne(String s[]) {
        return s[new Random().nextInt(s.length - 1)];
    }

    /**
     * 随机生成两位数的字符串(01-max),不足两位的前面补0
     *
     * @author mingzijian
     * @param max
     * @return
     */
    public String randomCityCode(int max) {
        int i = new Random().nextInt(max) + 1;
        return i > 9 ? i + "" : "0" + i;
    }

    /**
     * 随机生成minAge到maxAge年龄段的人的生日日期
     *
     * @author mingzijian
     * @param minAge
     * @param maxAge
     * @return
     */
    public String randomBirth(int minAge, int maxAge) {
        SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");// 设置日期格式
        Calendar date = Calendar.getInstance();
        date.setTime(new Date());// 设置当前日期
        // 随机设置日期为前maxAge年到前minAge年的任意一天
        int randomDay = 365 * minAge
                + new Random().nextInt(365 * (maxAge - minAge+1));
        date.set(Calendar.DATE, date.get(Calendar.DATE) - randomDay);
        return dft.format(date.getTime());
    }

你可能感兴趣的:(java 身份证号码)