18位身份证号码校验
问题描述
现在我国公民使用的18位身份证号码,由前 17位信息码和最后1位校验码组成。前17位信息码,有各自的含义:6位地址码,8位出生日期码,3位顺序码。
- 前6位的地址码,是按照GB/T2260的规定,给常住户口所在县(市、旗、区)的行政区域分配的代码。
- 8位出生日期码代表出生日期,分别是XXXX年XX月XX日。
- 3位顺序码表示在同一地区,给同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
最后1位校验码由前17位信息码通过校验规则计算得出:
分析
图中沿着红色箭头运算方向,需要记下各位对应的权值;而沿着绿色箭头运算方向,仅需左移运算符。为了使代码简洁,我们不去将各位对应的权值写到代码中,而采用位运算的方法。并且算法中可以将最后一位也统一到前17位的运算中,避免了将“校验码对照表”写进代码中。
实现
以下是基于C++11的身份证号码校验的实现:
#include <cstdint>
#include <iostream>
#include <string>
#include <vector>
#include <numeric>bool CheckId(const std::string &id)
{if (id.length() != 18) return false;std::vector<uint32_t> v;for (auto it = id.rbegin(); it != id.rend(); ++it) {if (*it >= '0' && *it <= '9') {v.push_back(*it - '0');}else if ((*it == 'x' || *it == 'X') && (it == id.rbegin())) {v.push_back(10);}else {return false;}}for (int i = 0; i < v.size(); ++i) {v[i] <<= i;}if (std::accumulate(v.begin(), v.end(), 0) % 11 == 1) {return true;}return false;
}int main(int argc, char *argv[])
{std::string id;std::cout << "Please input your ID number:" << std::endl;std::cin >> id;std::cout << (CheckId(id) ? "Right" : "Wrong") << std::endl;
}
18位身份证号码校验相关推荐
- 18位身份证号码最后一位校验码的计算方法
介绍18位身份证号码最后一位校验码的计算方法 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. ...
- 关于18位身份证号码最后一位计算(Java实现)
关于18位身份证号码最后一位计算(Java实现) 现代的身份证号码长度都是18位的,但是只要知道前17位便可推出第18位数字或者字母(第18位为0,1,...,9和X中的一个).也就是说,国内不存在前 ...
- 15/18位身份证号码验证的正则表达式总结(详细版)
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- 18位身份证号码规则及js验证
2019独角兽企业重金招聘Python工程师标准>>> 一.中国居民身份证号码规则 18位身份证号码编码规则:根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份 ...
- MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- 15/18位身份证号码验证
15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...
- 15位、18位身份证号码正则表达式
身份证正则表达式 在项目中遇到身份证号码验证,百度了一些资料,太简单的和太复杂的pass,综合了一些案例,取长补短,形成了个折中版本的,正则表达式如下: var reg =/(^[1-9]\d{5}( ...
- Oracle 通过15位或18位身份证号码计算年龄、出生年月日、性别
15位身份证号码各位的含义: 地址码(前六位数):表示身份证编码对象常住户口所在省份.地市,以及县(市.旗.区)的行政区划代码,1-2位数字表示所在地省.自治区.直辖市代码,第3.4位数字表示所在地地 ...
- python正则表达式 身份证_15/18位身份证号码验证的正则表达式总结(详细版)
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- 15位和18位身份证号码的结构介绍
身份证号码编码方法 要进行身份证号码的验证,首先要了解身份证号码的编码规则.我国身份证号码多由若干位数字或者数字与字母混合组成.早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考 ...
最新文章
- 【转载】 Python动态生成变量
- 常用的分布式事务解决方案介绍有多少种?
- 干掉visio,这个画图神器真的绝了!!!
- python中对数组合并的方法
- java动物飞翔接力赛源程序_java-submityourcode
- 【已解决】Class not found: “com.bjpowernode.MyTest“
- 俄罗斯方块剖析之一总体计划
- 【转】深入理解JavaScript闭包(closure)
- mysql添加分区健_MySQL添加分区添加索引
- rsync配置和使用
- EL表达式和JSTL标签的区别
- 浅谈嵌入式软件的未来发展
- 配置ANDROID开发环境的方法
- 对于vertical-align的学习
- 多屏系统上播放幻灯片的设想
- 好用的BUS调试工具-Bus Hound
- python游戏对象_python基础----以面向对象的思想编写游戏技能系统
- CSS flex属性深入理解
- 使用rimraf一秒删除node_modules文件夹【亲测有用】
- 通过云效 CI/CD 实现微服务全链路灰度