每个人的身份证号码都都是一串有特别意义的数字,如代表出生地,出生日,性别等,那么对于行政上的一些工作,核对身份证是不是输入有误,身份证是否造假,也是可以通过身份证上的号码数字进行核对检查。

先看一下原理,二代身份证共18位,那么最后一位是由前面的18位通算术来计算出来的,如果某一位出错,那么校验结果就会不一致,引此来判断这个身份证号是不是正确合法。

再看一下算法,先将身份证前面的17位数分别乘以不同的系数,如图所示

把这个17位数字和系数相乘后所得的结果相加,得到一个总和数,再除以11得到余数,那么余数与校验码(身份证是的最后一位)相对应的关系如图所示,即如果余数为3,校验码为9。

下面是代码实现这个算法以及对整个身份证号码的校验

int checkdate(int iYear, int iMonth, int iDay)
{if (iYear < 0 || iYear > 9999)return -1;switch (iMonth){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if (iDay <= 0 || iDay > 31){return -3;}break;case 4:case 6:case 9:case 11:if (iDay <= 0 || iDay > 30){return -3;}break;case 2:if ((iYear % 4 == 0 && iYear % 100 != 0) || iYear % 400 == 0){if (iDay <= 0 || iDay > 29){return -3;}}else{if (iDay <= 0 || iDay > 28){return -3;}}break;default:return -2;}return 0;
}int CheckStrDate(char *sDate)
{int iRet;char sYear[5];char sMonth[3];char sDay[3];memset(sYear, 0, sizeof(sYear));memset(sMonth, 0, sizeof(sMonth));memset(sDay,   0, sizeof(sDay));if (strlen(sDate) != 8)return -1;memcpy(sYear, sDate, 4);memcpy(sMonth, sDate+4, 2);memcpy(sDay,   sDate+6, 2);iRet = checkdate(atoi(sYear), atoi(sMonth), atoi(sDay));if (iRet != 0)return -1;return 0;
}int IdCardIsOK(char *sIdCardNo)
{int    i;int    iRet;int    iWeight[18] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};char   cCheck[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};    char   sDate[8 + 1];int    iDate;int    Sum = 0; time_t tt = time(NULL); tm *curT = localtime(&tt);if (!sIdCardNo || strlen(sIdCardNo) != 18)return -1;/* 身份证7-14位是否有效 */memset(sDate, 0, sizeof(sDate));memcpy(sDate, sIdCardNo + 6, 4);iDate = atoi(sDate);if (iDate < 1900 || iDate > 1900 + curT->tm_year) {return -2;}memset(sDate, 0, sizeof(sDate));memcpy(sDate, sIdCardNo + 6, 8);iRet = CheckStrDate(sDate);if (iRet < 0) {return -3;}/* 身份证18位校验位是否有效 */for (i = 0; i < 17; i ++) {memset(sDate, 0, sizeof(sDate));sDate[0] = sIdCardNo[i];iDate = atoi(sDate);Sum += iWeight[i] * iDate;}Sum %= 11;if ('x' == sIdCardNo[17]) {sIdCardNo[17] = 'X';}if (cCheck[Sum] != sIdCardNo[17]) {return -4;}return 0;
}

如何对身份证号码进行校验?相关推荐

  1. iOS之身份证号码全校验与校验位自动补全

    在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 长度必须是18位,前17位必须是数字,第十八位可以是数字或X: 前两位必须是以下情形中的一种:11.12.13.14.15.21 ...

  2. Python编程100例--身份证号码的校验码

    身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...

  3. C语言——实验一:查验身份证(身份证号码的校验码)

    前言 为什么我这个萌新要来写这篇文章?事情还要从上周三说起. 在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为<实验一:查验身份证>的实验作业,这也是我第一次接触到实验作业 ...

  4. java身份证号码正则表达式校验(含最后一位的校验值规则)

    这里是python版本的: https://yanwenjing.blog.csdn.net/article/details/108210623 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身 ...

  5. python身份证号码正则表达式校验(含最后一位的校验值规则)

    这里是java版本的:https://yanwenjing.blog.csdn.net/article/details/76066985 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身份证号码 ...

  6. 探究from表单的身份证号码的校验逻辑 javascript

    start 最近番茄学习前端八股文,学的有些乏味了.随即在应用商店下载了几个小游戏,准备把玩放松一下. 众所周知,现在玩游戏都是要身份证实名认证的,但是我又有精神洁癖,不想把自己的身份证提供给这种小作 ...

  7. Java:15位或18位居民身份证号码通用校验(正则表达式、日期格式、末尾校验码)

    身份证号码校验,正则表达式校验.日期格式校验.18位身份证末尾校验码校验 前六位省市县号码变更频繁,这里就不做校验 import java.text.ParseException; import ja ...

  8. 【python】身份证号码有效性校验

    1. 前言 中华人民共和国国家标准GB 11643-1999<公民身份号码>中规定:公民身份号码是特征组合码,由17位数字本体码和1位校验码组成. 18位数字组合的方式是: 其中,最后一位 ...

  9. js中15位及18位身份证号码的校验

    15位身份证结构: 地区代码(6位),年(2位)月(2位)日(2位),顺序码(3位,最后1位偶数代表女,奇数代表男) 18位身份证结构: 地区代码(6位),年(4位)月(2位)日(2位),顺序码(3位 ...

最新文章

  1. git 设置 key 到服务器,同步代码不需要输入用户名和密码
  2. Android源码下载资料
  3. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
  4. Mac~git学习和应用需要注意的几个点
  5. java:我们对Iterator理解错了
  6. plsql 简单介绍
  7. 算法竞赛训练指南代码仓库_数据仓库综合指南
  8. 【转】ABP源码分析四十四:ZERO的配置
  9. 轮番滑动PHP,touch事件之滑动判断(左右上下方向)
  10. ubuntu apache配置负载均衡篇(二)
  11. 3dcaptcha php,php实现的Captcha验证码类实例
  12. vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
  13. 对于公司来说,企业内训是否真的有必要?
  14. linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动
  15. 惯导系统误差分析(一) 惯性导航系统的误差与误差源
  16. 扩展欧几里得算法的实现
  17. Python 教程推荐
  18. 怎么关闭vivo系统自检_MIUI11系统已发布,你怎么能不会这个一键关闭广告的功能呢!...
  19. VMware vCenter Converter Standalone
  20. JVM系列之深入理解JVM(三)

热门文章

  1. 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
  2. android baseadapter优化,2.4.6 BaseAdapter优化
  3. Linux vi命令大全
  4. Universal Extractor各类流氓安装程序克星
  5. 计算机信息技术知识点思维导图,初中信息技术《计算机系统》单元教学设计以及思维导图.doc...
  6. go语言的魔幻旅程18-bytes包
  7. PostgreSQL 并发控制 -- 锁体系(spinlock,lwlock,regular lock)实现原理
  8. C#的俄罗士代码!!
  9. Dal数据公共缓存类,还有点问题集思广益,大家多多提问题
  10. Druid 加载 Kafka 数据时通过控制台来提交一个 supervisor