中国公民身份证号码校验

上图可看出18位位身份证每一部分表示的意义。

图为随机生成身份号码,四川省 乐山市 井研县 1981年12月28日生

这里主要讲解最后一位校验码的验证

校验码主要是由前面17位数字通过特殊运算得到的,

运算的过程与加权因子又息息相关

编号:      17  16   15  14  13  12  11  10  9   8   7   6   5  4  3  2  1  0

身份信息:5 1     1     1    2    4     1    9    8   1   1   2   2   8  6  8   9  6

加权因子:7    9    10   5    8   4     2   1    6   3   7  9  10  5  8  4  2  1

分别从第一位2的17次方除以11取余,第二位2的16次方除以11取余,以此类推。

这样得到加权因子后,在分别把每一位的身份证号与因子相乘求和。

sum = 5*7+1*9+1*10+1*5+2*8+4*4+1*2+9*1+8*6+1*3+1*7+2*9+2*10+8*5+6*8+8*4+9*2+6*1

再把sum除以11取余,得到的数可以当做是校验码的前身。

因为得到的余数可能是0~10,而实际阿拉伯数字只是0~9,所以用罗马符号X代替一位。

而实际的对应关系确实这样的:

余数           0     1     2     3     4     5     6     7     8     9     10

校验码       1     0     X     9     8     7     6     5     4     3     2

下面是具体的验证方法,写的不好的地方还望大家指正。

import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.regex.Pattern;public class IdCard {//  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:"国外"static String[] citycode = { "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" };//17位加权因子//来源,分别从第一位2的17次方除以11取余,第二位2的16次方除以11取余,以此类推static int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; //11位校验码,这里校验码X用-1表示,对应的是0,1,2,3,4,5,6,7,8,9,10static int ai[] = {1,0,-1,9,8,7,6,5,4,3,2};/*** 对18位身份证做个验证例子。* 考虑到行政区划代码变动情况,这里只验证省* 在这可以查看行政区划代码,http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/* 15位身份证,出生年只有两位,缺少最后一位校验码*/public static void main(String[] args) {String idcard = "511124198112286896";//虚拟的身份证号//简单的正则确认,非空什么的暂时不考虑了boolean b = Pattern.matches("^\\d{17}(?:\\d|x|X)$", idcard);if(!b)return;//数组转list,方便查找List<String> citycodeList = Arrays.asList(citycode);//验证省份String province = idcard.substring(0, 2);//省份String yearMonthDay = idcard.substring(6, 14);int year = Integer.parseInt(idcard.substring(6, 10));//年int month = Integer.parseInt(idcard.substring(10, 12));//月int day = Integer.parseInt(idcard.substring(12, 14));//日if(citycodeList.contains(province)){Calendar birthday = new GregorianCalendar(year,month-1,day);String newyear = String.valueOf(birthday.get(Calendar.YEAR));while(newyear.length()<4){newyear = "0"+newyear;}String newmonth = String.valueOf(birthday.get(Calendar.MONTH)+1);while(newmonth.length()<2){newmonth = "0"+newmonth;}String newday = String.valueOf(birthday.get(Calendar.DAY_OF_MONTH));while(newday.length()<2){newday = "0"+newday;}//校验今天前的日期,和日期的正确性if(birthday.before(Calendar.getInstance())&&yearMonthDay.equals(newyear+newmonth+newday)){//下面是关键的校验码核对checkPower(idcard);}else{System.out.println("日期不对");}}else{System.out.println("省份不对");}}static void checkPower(String idcard){if(idcard.length()==18){int sum = 0;for(int i=0;i<17;i++){int temp = Integer.parseInt(String.valueOf(idcard.charAt(i)))*power[i];sum += temp;}int bum = sum%11;if(String.valueOf(ai[bum]).toUpperCase().equals(String.valueOf(idcard.charAt(17)).toUpperCase())){System.out.println("身份证校验通过");}}}
}

详细的行政区划代码验证可以参考: http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/

中国公民身份证号码校验相关推荐

  1. Js实现中国公民身份证号码有效性验证

    2019独角兽企业重金招聘Python工程师标准>>> 参考: Java实现中国公民身份证号码有效性验证 Php实现中国公民身份证号码有效性验证 本文将使用JavaScript实现中 ...

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

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

  3. 公民身份号码 校验码 检证程序

    公民身份号码  校验码 检证程序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  4. 公民身份号码校验码算法(C#版)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 基于可视化结构的身份证号码校验系统-树莓派实现

    基于可视化结构的身份证号码校验系统 摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果.系统通过运用基础GUI库tkinter创建系 ...

  6. Python小白入门- 101 ( 工具篇) Python完成身份证号码校验的算法

    根据国家标准GB 11643-1999<公民身份证号码>的要求: 身份证号码由18位组成,前17位为数字,最后一位是校验码,可能为数字或字母X.其中,前6位是地区代码,接下来8位是出生日期 ...

  7. 公民身份号码 校验码 检证程序

    公民身份号码  校验码 检证程序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

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

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

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

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

最新文章

  1. php手机定位导航,js实现网页定位导航功能
  2. 60日均线操盘的三种入场点形态
  3. python从事哪些职业好玩_Python就业可选方向有哪些?带你了解Python主流职业选择!...
  4. 332. 重新安排行程(回溯算法)
  5. Java?Python?Let us GO!
  6. gensim读取已训练模型LDA模型的模型与dictionary
  7. 微信h5实现分享给朋友url改变_h5微信自定义分享
  8. 博弈论基础知识--非合作博弈,零和博弈,负和博弈,主从博弈,Nash均衡
  9. UBT19:ubuntu安装qq与微信
  10. 上传大文件至阿里云服务器解决方案(理论上无限大文件,支持批量处理)
  11. html动画转换为gif,css 将长图做成gif动画
  12. ADS1115的四通道使用
  13. RCTF crypto100(1)
  14. 文本文件单词的检索与计数c语言,文本文件单词的检索与计数
  15. 键盘输入突然混乱,敲击字母或空格,变为打开菜单栏的项目
  16. elasticsearch分词练习、自定义分词器练习
  17. zblog html代码,ZBLOG调出最新留言评论内容代码
  18. UOS V20 SP1 升级到Update1 后WPS无法打开
  19. crazy的比较级最高级_形容词比较级和最高级more, most
  20. 不同格式文件之间的相互转化

热门文章

  1. 怎么手工解决DRA中的failure?
  2. PV、UV、IP之间的区别与联系
  3. 做项目必须懂的三个概念 认证、会话、授权
  4. [学习路线图1]PHP学习路线图(初级)
  5. java毕业生设计疫情防控网站计算机源码+系统+mysql+调试部署+lw
  6. 【旅游景点分析】--从数据搜集到清洗再到可视化呈现
  7. android vpnservice SSTP 协议在连接过程遇到的问题
  8. 关于I2C设备地址(7位)的误解
  9. java 根据ip地址获取地理位置及运营商。
  10. anaconda环境---ubuntu下重装