生成身份证

1.环境:eclipse、jdk1.8
2.身份证规律(例:101161196606066868)
a.1-6位:所在省份、城市、区县的代码
b.7~14位:出生年、月、日
c.15、16位:户口所在地派出所的代表号码;
d.17位:奇数表示男性,偶数表示女性;
e.18位:数字是校检码,根据前十七位数字计算

3. 1-6位的省份地区代码从网上找

4.核心代码

private Boolean handleIdcard() {
		SimpleDateFormat sim = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//设置日期
		Calendar birthday = Calendar.getInstance();
		birthday.set(Calendar.YEAR, startYear);
		birthday.set(Calendar.MONTH, 0);
		birthday.set(Calendar.DATE, 1);
		while (true) {
			String format = sim.format(birthday.getTime());
			Integer everyDay = Integer.valueOf(format);
			if (everyDay > endBirthday) {
				break;
			}
				// 处理顺序码15-17位
			String endThree = "0";
			for (int i = 0; i < 999; i++) {
				if (i < 10) {
					endThree = "00" + i;
				} else if (i < 100) {
					endThree = "0" + i;
				} else {
					endThree = "" + i;
				}
				//areaCode为地区6位,everyDay为出生年月,endThree为后四位中的前三位
				String idcardSomeTwo = areaCode + everyDay + endThree;
				//dataList存放生成的身份证、verification方法用来计算最后一位
				dataList.add(idcardSomeTwo + idcardUtil.verification(idcardSomeTwo));
				if (dataList.size() == countOne) {
					System.out.println("正在处理时间:" + format + ", 当前时间:" + sim1.format(new Date()));
					handleEvery(dataList);
					dataList.clear();
				}
			}
			birthday.add(Calendar.DATE, 1);//天数加1
		}
		System.out.println(" 【end Batch】 ing...");
		long a = System.currentTimeMillis();
		handleEvery(dataList);
		addBatchMysql();
		long b = System.currentTimeMillis();
		System.out.println("endBatch【总数:" + count + "】,时间:" + (b - a) / 1000);
		dataList.clear();
		return true;
	}

5.最后一位生成工具类

/*
	 * 校验码的计算方法
	 * (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。(即余数0对应1,余数1对应0,余数2对应X...)
	 */
	public static String verification(String str17) {
		// 传入前17位数字拆成数组
		char[] chars = str17.toCharArray();
		if (chars.length < 17) {
			sleepSome("传入身份证小于17位", 500000);
		}
		// 前十七位分别对应的系数
		int[] coefficient = { 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对应的验证码如下
		char[] resultChar = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
		// 存放17位数字int数组
		int[] numberArr = new int[17];
		// 赋值:将chars数组赋值到 int数组
		for (int i = 0; i < numberArr.length; i++) {
			numberArr[i] = Integer.parseInt(chars[i] + "");
		}
		// 相加结果集
		int result = 0;
		// 遍历身份证17位数字的 int数组,每位数字和所对应系数相乘 相加到结果集
		for (int i = 0; i < numberArr.length; i++) {
			result += coefficient[i] * numberArr[i];
		}
		// 结果集除以11的余数
		return String.valueOf(resultChar[result % 11]);//
	}

6.记录实际需求:生成各地区身份证号及md5后的数据,存放mysql数据库。

  • 数据库:根据md5前两位(a-f,0-9)建了256个库
    • Set<String> endSet=new HashSet<>(); char[] chars={'a','b','c','d','e','f','0','1','2','3','4','5','6','7','8','9'}; for (int i = 0; i < chars.length; i++) { for (int j = 0; j < chars.length; j++) { endSet.add(chars[i]+""+chars[j]); endSet.add(chars[j]+""+chars[i]); } }
  • 程序入口:main方法
  • 写好程序打成jar包,在linux服务器跑
  • linux服务器(安装java1.8,mysql数据库)
    • 启动jar包在后台运行
      nohup java -jar idcard01jar.jar&
      查看日志
      tail -fn 50 nohup.out
      查看当前java进程
      ps -ef|grep java

7.遇到的难点

  • 程序在服务器跑,越跑越慢,插入效率低下。
  • 解决办法:建数据库时不加索引,跑完再加索引。加索引的数据库一直插入数据 效率低下。

猜你喜欢

转载自blog.csdn.net/weixin_37630333/article/details/88996443