身份证作为居民的唯一标识。在很多系统中需要用户输入身份证号信息,今天我们就来编写一个方法验证身份证号的合法性。

首先我们来看看身份证号的编码规则:
前1-2位数字表示:所在省(直辖市、自治区)的代码;
第3-4位数字表示:所在地级市(自治州)的代码;
第5-6位数字表示:所在区(县、自治县、县级市)的代码;
第7-14位数字表示:出生年、月、日;
第15-16位数字表示:所在地的派出所的代码;
第17位数字表示性别:奇数表示男性,偶数表示女性;
第18位数字是校检码:也有的说是个人信息码,不是随计算机的随机产生,它是 用来检验身份证的正确性。校检码可以是0-9的数字,有时也用X表示。

知道了规则之后,我们再来看看算法:
第一步:将身份证号码的第1位数字与7相乘;将身份证号码的第2位数字与9相乘;将身份证号码的第3位数字与10相乘;将身份证号码的第4位数字与5相乘;将身份证号码的第5位数字与8相乘;将身份证号码的第6位数字与4相乘;将身份证号码的第7位数字与2相乘;将身份证号码的第8位数字与1相乘;将身份证号码的第9位数字与6相乘;将身份证号码的第10位数字与3相乘;将身份证号码的第11位数字与7相乘;将身份证号码的第12位数字与9相乘;将身份证号码的第13位数字与10相乘;将身份证号码的第14位数字与5相乘;将身份证号码的第15位数字与8相乘;将身份证号码的第16位数字与4相乘;将身份证号码的第17位数字与2相乘。
第二步:将第一步身份证号码1~17位相乘的结果求和,全部加起来。
第三步:用第二步计算出来的结果除以11,这样就会出现余数为0,余数为1,余数为2,余数为3,余数为4,余数为5,余数为6,余数为7,余数为8,余数为9,余数为10共11种可能性。
第四步:如果余数为0,那对应的最后一位身份证的号码为1;如果余数为1,那对应的最后一位身份证的号码为0;如果余数为2,那对应的最后一位身份证的号码为X;如果余数为3,那对应的最后一位身份证的号码为9;如果余数为4,那对应的最后一位身份证的号码为8;如果余数为5,那对应的最后一位身份证的号码为7;如果余数为6,那对应的最后一位身份证的号码为6;如果余数为7,那对应的最后一位身份证的号码为5;如果余数为8,那对应的最后一位身份证的号码为4;如果余数为9,那对应的最后一位身份证的号码为3;如果余数为10,那对应的最后一位身份证的号码为2。

了解了身份证号的规则之后,我们就可以对其进行校验:

public class IDCardValidate
{public static boolean validate(String no){// 对身份证号进行长度等简单判断if (no == null || no.length() != 18 || !no.matches("\\d{17}[0-9X]")){return false;}// 1-17位相乘因子数组int[] factor = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };// 18位随机码数组char[] random = "10X98765432".toCharArray();// 计算1-17位与相应因子乘积之和int total = 0;for (int i = 0; i < 17; i++){total += Character.getNumericValue(no.charAt(i)) * factor[i];}// 判断随机码是否相等return random[total % 11] == no.charAt(17);}public static void main(String[] args){// 正确System.out.println(validate("432831196411150810"));// 错误System.out.println(validate("432831196411150813"));}
}

2018年04约13日添加

上面的验证是提供了一个思路,对二代身份证号码进行了验证,下面补充一个相对全一些示例,可以实现一代与二代身份证号码的校验,并提供了二代身份证号码之间的转换。代码如下:

package com.jianggujin.messagequery;import java.util.regex.Pattern;/*** 身份证号码规则:<br/>* 第一代身份证:<br/>* 1-2:所在省(直辖市、自治区)的代码<br/>* 3-4:所在地级市(自治州)的代码<br/>* 5-6:所在区(县、自治县、县级市)的代码<br/>* 7-12:出生年(两位)、月、日<br/>* 13-14:所在地的派出所的代码<br/>* 15:奇数表示男性,偶数表示女性<br/>* 第二代身份证:<br/>* 1-2:所在省(直辖市、自治区)的代码<br/>* 3-4:所在地级市(自治州)的代码<br/>* 5-6:所在区(县、自治县、县级市)的代码<br/>* 7-14:出生年、月、日<br/>* 15-16:所在地的派出所的代码<br/>* 17:奇数表示男性,偶数表示女性<br/>* 18:也有的说是个人信息码,不是随计算机的随机产生,它是 用来检验身份证的正确性。校检码可以是0-9的数字,有时也用X表示。* * @author jianggujin**/
public class JIdCardUtils {private final static Pattern PARTTERN_CARD_NO = Pattern.compile("\\d{15}|\\d{17}[0-9X]");private final static Pattern PARTTERN_DATE = Pattern.compile("(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)");// 1-17位相乘因子数组private final static int[] FACTOR = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };// 18位随机码数组private final static char[] RANDOM = "10X98765432".toCharArray();public boolean validate(String idCardNo) {// 对身份证号进行长度等简单判断if (idCardNo == null || !PARTTERN_CARD_NO.matcher(idCardNo).matches()) {return false;}int len = idCardNo.length();// 一代身份证if (len == 15) {return PARTTERN_DATE.matcher("19" + idCardNo.substring(6, 12)).matches();}// 二代身份证if (len == 18 && PARTTERN_DATE.matcher(idCardNo.substring(6, 14)).matches()) {// 判断随机码是否相等return calculateRandom(idCardNo) == idCardNo.charAt(17);} else {return false;}}/*** 计算最后一位随机码* * @param idCardNo* @return*/private char calculateRandom(String idCardNo) {// 计算1-17位与相应因子乘积之和int total = 0;for (int i = 0; i < 17; i++) {total += Character.getNumericValue(idCardNo.charAt(i)) * FACTOR[i];}// 判断随机码是否相等return RANDOM[total % 11];}/*** 计算最后一位随机码* * @param idCardNo* @return*/private char calculateRandom(char[] idCardNo) {// 计算1-17位与相应因子乘积之和int total = 0;for (int i = 0; i < 17; i++) {total += Character.getNumericValue(idCardNo[i]) * FACTOR[i];}// 判断随机码是否相等return RANDOM[total % 11];}/*** 15和18位身份证号码转换* * @param idCardNo* @return*/public String convert(String idCardNo) {if (idCardNo == null) {throw new IllegalArgumentException("idCardNo must not null.");}if (!validate(idCardNo)) {throw new IllegalArgumentException("idCardNo invalid.");}int len = idCardNo.length();char[] result = null;int index = 0;if (len == 15) {// 添加年份与随机码result = new char[18];// 复制行政区域代码for (; index < 6; index++) {result[index] = idCardNo.charAt(index);}// 添加年份,固定值:19result[index++] = '1';result[index++] = '9';// 添加年月日与附加信息for (; index < 17; index++) {result[index] = idCardNo.charAt(index - 2);}result[index] = calculateRandom(result);} else if (len == 18) {// 去除年份与随机码result = new char[15];// 复制行政区域代码for (; index < 6; index++) {result[index] = idCardNo.charAt(index);}// 跳过两位年份;index += 2;// 去除最后一位for (; index < 17; index++) {result[index - 2] = idCardNo.charAt(index);}}if (result == null) {throw new IllegalArgumentException("idCardNo length must equals 15 or 18.");}return new String(result);}
}

需要注意的是上面的代码并没有校验行政区域代码的有效性,仅仅校验了是否为6位数字,如果想要校验行政区域代码,可以查询公共信息判断代码是否合法。

Java验证身份证号是否合法相关推荐

  1. java验证身份证号格式

    //15位到18位的身份证号 public static boolean checkIdCard(String idCard) { String regex = "^[1-9]\\d{7}( ...

  2. 验证身份证号是否合法

    一.身份证位数15或者18位 最后一位可以为字母 二.身份证前6位[ABCDEF]为行政区划数字代码(简称数字码): –15位身份证号码:第7.8位为出生年份(两位数),第9.10位为出生月份,第11 ...

  3. Java验证身份证号码及提取生日信息

    Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正 ...

  4. python判断身份证是否合法的函数_Python开发之身份证验证库id_validator验证身份证号合法性及根据身...

    上个星期,大佬分享了一个验证身份证号合法性的库:id_validator,没空去试着用一下看看,今天有点时间,来试着用下这个库. 1.首先,要安装这个库,windows+R键运行cmd,打开命令行窗口 ...

  5. 【SQLServer】验证身份证号第18位校验码是否合法

    目录 1.业务场景 2.知识前提 3.实现方案 4.测试 5.参考链接 1.业务场景 参考国家标准GB 11643-1999,居民身份证号组成:6位数字地址码+8位数字出生日期码+3位数字顺序码+1位 ...

  6. 判断身份证号是否合法;验证城市区号,生日

    判断身份证号是否合法 ; 验证城市区号 , 生日 直接上代码 /*** 判断身份证号是否合法* 验证城市区号;生日* Date:2018年12月29日 * @author D2yml**/ publi ...

  7. js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr)...

    js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr) 一.总结 1.|符号的使用:var reg=/^\d ...

  8. 用java根据身份证号提取性别和年龄

    在 Java 中,可以使用以下步骤来提取身份证号中的性别和年龄信息: 使用正则表达式验证身份证号的格式是否正确. 如果身份证号的格式正确,则可以使用截取字符串的方法来提取出生日期信息.身份证号中的出生 ...

  9. 学以致用——Java验证身份证号码是否正确(带校验算法)

    需求: 验证身份证号码是否正确(带校验算法) 源码: package javaCoreTech1; import java.io.BufferedReader; import java.io.IOEx ...

最新文章

  1. EasyBridge:一种简单的js-bridge设计方案
  2. Eclipse与MyEclipse的选择问题
  3. NoClassDefFoundError: org/mybatis/logging/LoggerFactory
  4. bzoj1297 [SCOI2009]迷路——拆点+矩阵快速幂
  5. linux基础知识个人总结
  6. 前端学习(1109):函数的调用
  7. [飞秋]局域网聊天写的代码旁人从来看不
  8. 服务器摆放需要预留U位么_卧室系列 | 选床+摆放新姿势,提升睡眠品质小技巧...
  9. 【java笔记】random类生成随机数
  10. matlab绘制正弦波频谱图,matlab对正弦信号作FFT得到频谱图
  11. 弃全从简 转转的二手手机路好走吗?
  12. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
  13. 团体程序设计天梯赛-练习集)(5分)
  14. Substrate区块链框架学习小组
  15. wps自动图文集 重新编号_如何使用自动图文集在Microsoft Word中快速插入文本块
  16. 数字图像处理100问—40 JPEG 压缩——第四步:YCbCr+离散余弦变换+量化
  17. 百城价格房价周期和郑州、武汉房价比较分析
  18. 一文详解8种异常检测算法(附Python代码)
  19. css中去掉列表ul中的圆点
  20. 机器学习-使用决策树DecisionTreeRegressor模型对水果蔬菜价格预测

热门文章

  1. Ai图案(花朵、花纹、科技感)绘制
  2. 计算机类的专利号,一种计算机机箱
  3. csdn空格用什么表示
  4. 基于LabVIEW编程的气象监测系统
  5. 2021-7-26 ad9361 调频点
  6. appium 多个APP进行切换测试
  7. 利用layui完成树状图
  8. KubeMeet|聊聊新锐开源项目与云原生新的价值聚焦点
  9. DDR存储器中的一些概念
  10. 微信QQ发布新版,接近一个G?内置4个虚拟引擎,这才叫做“大”更新