import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;/*** 身份证校验*/
@Configuration
public class IDCardCheck {/*** <pre>* 省、直辖市代码表:*   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 : 澳门*   91 : 国外* </pre>*/final static String CITY_CODE[] = {"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", "91"};/*** 效验码*/final static char[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};/*** 加权因子* Math.pow(2, i - 1) % 11*/final static int[] POWER = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};/*** 身份证验证** @param id 号码内容* @return 是否有效*/public final static boolean isValid(String id) {if (id == null)return false;int len = id.length();if (len != 15 && len != 18)return false;//校验区位码if (!validCityCode(id.substring(0, 2)))return false;//校验生日if (!validDate(id))return false;if (len == 15)return true;//校验位数return validParityBit(id);}private static boolean validParityBit(String id) {char[] cs = id.toUpperCase().toCharArray();int power = 0;for (int i = 0; i < cs.length; i++) {//最后一位可以是Xif (i == cs.length - 1 && cs[i] == 'X')break;// 非数字if (cs[i] < '0' || cs[i] > '9')return false;// 加权求和if (i < cs.length - 1) {power += (cs[i] - '0') * POWER[i];}}return PARITYBIT[power % 11] == cs[cs.length - 1];}private static boolean validDate(String id) {try {String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date birthDate = sdf.parse(birth);if (!birth.equals(sdf.format(birthDate)))return false;} catch (ParseException e) {return false;}return true;}private static boolean validCityCode(String cityCode) {for (String code : CITY_CODE) {if (code.equals(cityCode))return true;}return false;}/*** 将15位的身份证转成18位身份证** @param id* @return*/final public static String id15To18(String id) {if (id == null || id.length() != 15)return null;if (!isValid(id))return null;String id17 = id.substring(0, 6) + "19" + id.substring(6);int power = 0;char[] cs = id17.toCharArray();for (int i = 0; i < cs.length; i++) {power += (cs[i] - '0') * POWER[i];}// 将前17位与第18位校验码拼接return id17 + String.valueOf(PARITYBIT[power % 11]);}/*** 生成随机整数* <p>** @param min* @param max* @return*/public static int rand(int min, int max) {Random random = new Random();return random.nextInt(max + 1) % (max - min + 1) + min;}public final static String generateID() {// 地址码String body = CITY_CODE[rand(0, CITY_CODE.length - 1)] + "0101";// 出生年String y = String.valueOf(rand(1950, Calendar.getInstance().get(Calendar.YEAR)));String m = String.valueOf(rand(1, 12));if (m.length() == 1)m = "0" + m;String d = String.valueOf(rand(1, 28));if (d.length() == 1)d = "0" + d;String idx = String.valueOf(rand(1, 999));if (idx.length() == 1)idx = "00" + idx;else if (idx.length() == 2)idx = "0" + idx;body += y + m + d + idx;// 累加body部分与位置加权的积int power = 0;char[] cs = body.toCharArray();for (int i = 0; i < cs.length; i++) {power += (cs[i] - '0') * POWER[i];}// 得出校验码return body + String.valueOf(PARITYBIT[power % 11]);}
}
 @Resourceprivate IDCardCheck idCardCheck;@Testpublic void testSearchAkmByIdCardNo(){System.out.println(idCardCheck.isValid("自己的身份证号码"));}

身份证号码校验java相关推荐

  1. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  2. java版本身份证号码校验与卫语句

    最近在公司做项目时,有一个小功能点就是身份证号码校验,即判断是否是合理的身份证号码.不想重复造轮子,想着公司的一些基础组件可能有这个功能,一找还真有,原作者代码逻辑应该是正确的,但是风格有点呵呵了,各 ...

  3. 【转载】 身份证号码校验(15位和18位都可以)

    转载自: 开源中国社区    面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...

  4. 中国公民身份证号码校验

    中国公民身份证号码校验 上图可看出18位位身份证每一部分表示的意义. 图为随机生成身份号码,四川省 乐山市 井研县 1981年12月28日生 这里主要讲解最后一位校验码的验证 校验码主要是由前面17位 ...

  5. JS身份证号码校验大全史上最全号称公安局安全监测

    身份证号码校验 function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5]) ...

  6. JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别

    目录 1.JS身份证号码校验 2.JS根据身份证号码获取出生年月日 3.JS根据出生年月日获取年龄 4.JS根据身份证号码获取性别 1.JS身份证号码校验 /*** 身份证校验** @export* ...

  7. validate格式校验之身份证号码校验

    //校验身份证号码 function isIdCardNo(num) {     var factorArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ...

  8. vue身份证号码校验

    一.vue身份证号码校验? let checkRegNo = (rule,value,callback) => {     setTimeout(() => {         const ...

  9. 身份证号码校验(JavaScript)

    /*** 身份证号码校验* 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X*/ function checkIdCard(idCard){v ...

最新文章

  1. Atitit 知识图谱的数据来源
  2. R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值、并与层次聚类的最优K值进行比较
  3. VS2002 与 IIS6.0的一个bug
  4. nmon_analyser 在Aix平台的使用方法
  5. kubernetes1.8.4 安装指南 -- 11. 安装kubernetes dashboard
  6. C语言——冒泡排序法
  7. Docker : Error response from daemon: Get https://docker.elastic.co/v2/: net/http: TLS handshake time
  8. C# 14位日期型字符串yyyyMMddHHmmss转变为日期格式
  9. 整理一下CCF推荐期刊会议(A类)
  10. matlab幅度归一化,matlab归一化方法
  11. 微信公众号唤起微信支付
  12. 使用uniapp开发微信小程序的人脸采集功能/人脸识别功能
  13. 485集线器,485Hub、485分配器、485共享器、三级浪涌保护,485星型接法设备 1拖4...
  14. 【LeetCode】643. 子数组最大平均数 I
  15. 【PTA-训练day6】L2-016 愿天下有情人都是失散多年的兄妹+ L1-011 帅到没朋友
  16. 计算机如何接两个屏幕,笔记本连接两个显示器的步骤_笔记本电脑怎么外接两个显示器做分屏-win7之家...
  17. Git 修改已提交的 commit 信息
  18. IDEA中如何引入jama.jar包
  19. 【Linux学习笔记】Linux下安装Libreoffice
  20. 输入10个数,将最大的数字输出;

热门文章

  1. 6、13iOS项目代码例子微博、地图、淘宝、豆瓣、指南针
  2. 【操作系统】实验三 进程调度模拟程序
  3. 关于赛车游戏的一点体会
  4. python怎么加载图片png_python怎么读取图片?
  5. github上的开源项目中gif图片的制作软件
  6. 【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架)...
  7. DBlink 入门案例
  8. 2022 最新TypeScript入门学习笔记
  9. 动态网页和静态网页的差异
  10. mac pdf去水印_如何在Mac上为PDF添加水印