如何对身份证号码进行校验?
每个人的身份证号码都都是一串有特别意义的数字,如代表出生地,出生日,性别等,那么对于行政上的一些工作,核对身份证是不是输入有误,身份证是否造假,也是可以通过身份证上的号码数字进行核对检查。
先看一下原理,二代身份证共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;
}
如何对身份证号码进行校验?相关推荐
- iOS之身份证号码全校验与校验位自动补全
在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 长度必须是18位,前17位必须是数字,第十八位可以是数字或X: 前两位必须是以下情形中的一种:11.12.13.14.15.21 ...
- Python编程100例--身份证号码的校验码
身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...
- C语言——实验一:查验身份证(身份证号码的校验码)
前言 为什么我这个萌新要来写这篇文章?事情还要从上周三说起. 在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为<实验一:查验身份证>的实验作业,这也是我第一次接触到实验作业 ...
- java身份证号码正则表达式校验(含最后一位的校验值规则)
这里是python版本的: https://yanwenjing.blog.csdn.net/article/details/108210623 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身 ...
- python身份证号码正则表达式校验(含最后一位的校验值规则)
这里是java版本的:https://yanwenjing.blog.csdn.net/article/details/76066985 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身份证号码 ...
- 探究from表单的身份证号码的校验逻辑 javascript
start 最近番茄学习前端八股文,学的有些乏味了.随即在应用商店下载了几个小游戏,准备把玩放松一下. 众所周知,现在玩游戏都是要身份证实名认证的,但是我又有精神洁癖,不想把自己的身份证提供给这种小作 ...
- Java:15位或18位居民身份证号码通用校验(正则表达式、日期格式、末尾校验码)
身份证号码校验,正则表达式校验.日期格式校验.18位身份证末尾校验码校验 前六位省市县号码变更频繁,这里就不做校验 import java.text.ParseException; import ja ...
- 【python】身份证号码有效性校验
1. 前言 中华人民共和国国家标准GB 11643-1999<公民身份号码>中规定:公民身份号码是特征组合码,由17位数字本体码和1位校验码组成. 18位数字组合的方式是: 其中,最后一位 ...
- js中15位及18位身份证号码的校验
15位身份证结构: 地区代码(6位),年(2位)月(2位)日(2位),顺序码(3位,最后1位偶数代表女,奇数代表男) 18位身份证结构: 地区代码(6位),年(4位)月(2位)日(2位),顺序码(3位 ...
最新文章
- git 设置 key 到服务器,同步代码不需要输入用户名和密码
- Android源码下载资料
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- Mac~git学习和应用需要注意的几个点
- java:我们对Iterator理解错了
- plsql 简单介绍
- 算法竞赛训练指南代码仓库_数据仓库综合指南
- 【转】ABP源码分析四十四:ZERO的配置
- 轮番滑动PHP,touch事件之滑动判断(左右上下方向)
- ubuntu apache配置负载均衡篇(二)
- 3dcaptcha php,php实现的Captcha验证码类实例
- vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
- 对于公司来说,企业内训是否真的有必要?
- linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动
- 惯导系统误差分析(一) 惯性导航系统的误差与误差源
- 扩展欧几里得算法的实现
- Python 教程推荐
- 怎么关闭vivo系统自检_MIUI11系统已发布,你怎么能不会这个一键关闭广告的功能呢!...
- VMware vCenter Converter Standalone
- JVM系列之深入理解JVM(三)
热门文章
- 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
- android baseadapter优化,2.4.6 BaseAdapter优化
- Linux vi命令大全
- Universal Extractor各类流氓安装程序克星
- 计算机信息技术知识点思维导图,初中信息技术《计算机系统》单元教学设计以及思维导图.doc...
- go语言的魔幻旅程18-bytes包
- PostgreSQL 并发控制 -- 锁体系(spinlock,lwlock,regular lock)实现原理
- C#的俄罗士代码!!
- Dal数据公共缓存类,还有点问题集思广益,大家多多提问题
- Druid 加载 Kafka 数据时通过控制台来提交一个 supervisor