18位身份证编码校验——我国第二代居民身份证

一道校验居民身份证编码校验码的小题,触发了我对我国第二代身份证整串编码的探究。


(笔记模板由python脚本于2023年12月14日 19:49:46创建,本篇笔记适合掌握Python字符串str基本数据类型,可以熟练应用于代码编写中的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


一道校验身份证编码校验码的小题
身份证18位编码校验
(触发了我对我国第二代身份证整串编码的探究)


本文质量分:

96

本文地址: https://blog.csdn.net/m0_57158496/

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 我国第二代身份证18位编码校验
    • 1、题目描述
    • 2、算法解析
      • 2.1 校验校验码
      • 2.2 校验行政区划省、市、县
      • 2.3 出生日期校验
      • 2.4 输入编码信息解析
      • 2. 次级灰色标题
    • 3、完整源码(Python)



◆ 我国第二代身份证18位编码校验


1、题目描述


1、将身份证号码前17位数分别乘以不同的系数(第1~17位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2);

2、将这17位数字和系数相乘的结果相加;

3、用加出来和除以11,看余数是多少?

4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字,其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;

5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。如果余数是10,身份证的最后一位号码就是2。

  根据上述知识编制一个函数,用于判断给定18位数字字符串(唯一可以在最后位上带大写字母X),校验是否正确。



回页目录


2、算法解析


  要校验身份证编码最后一位,就得根据题目描述中的规则,用前17位数字计算出校验码,与输入比对。

要点:

1、输入都是str字符串类型得转整型int才可以进行数值计算;

2、将计算得出的余数与校验码字典对应,取出校验码。

如:
在这里插入图片描述

  对校验校验码的编程实现,触发了我对居民身份证编码的浓厚兴趣,搜索百科仔细学习后,相对整串18位编码来一次校验。这对于我仅仅会python基础,还是一个极具挑战和小活儿哩。😋😋


18位第二代居民身份证编码组成

1~6位:行政区划编码依次每两个数字代表省、市、县级行政区划;
7~14位:出生日期。年4位,月日各两位;
15~17位:同地区同一天出生的人的序号
18位:校验码。


  可以点击“我国居民身份证”夸克百科词条,查阅关于“我国第二代居民身份证”的更多知识。

  接下来,就让我们正式开启“编排”身份证编码的快乐之旅——


2.1 校验校验码


  计算校验码的方案,前面已经阐述过了,这里就聊聊数据处理。拆分前17位数字并转换成整型列表,将17位系数也转成成整型列表,方便两两相乘。用zip函数列表解析出前17位数字编码和系数的积,sum函数求17个积总和,用其模11得其余数,在校验码字典中查出前17个数字编码对应的校验码,与输入比对校验。
  规则详见题目描述,点击蓝色文字跳转查阅。


  • 代码运行效果截屏图片
    在这里插入图片描述

Python代码


def isIdCheckcode(myId):''' 校验居民身份证校验码 '''id17 = map(int, list(myId[:-1])) # 拆分**ID前17位并转整型。ratio = map(int, '7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2'.split()) # 17位系数拆分并转整型。tailDict = dict(zip('0 1 2 3 4 5 6 7 8 9 10'.split(), '1 0 X 9 8 7 6 5 4 3 2'.split())) # ID末位总积和模11余数和实际字符对应字典。checkCode = tailDict.get(str(sum([i[0]*i[1] for i in zip(id17, ratio)]) % 11)) # 按ID编码规则计算模11余数。print(f"\n按编码规则计算出的ID校验码:{checkCode}")return checkCode == myId[-1]



回页目录



2.2 校验行政区划省、市、县


  我只从夸克百科词条查出我国省级行政区划代码,只可以校验1~2位省代码。如果加入市、县身份证编码数据,第3~6位也是可以校验的。😋

  如果输入前两个数字不在我国省行政区划身份证编码字典中,输入就不是合法第二代居民身份证编码。


我国身份证编码省级行政区划代码

北京市 110000
天津市 120000
河北省 130000
山西省 140000
内蒙古自治区 150000
辽宁省 210000
吉林省 220000
黑龙江省 230000
上海市 310000
江苏省 320000
浙江省 330000
安徽省 340000
福建省 350000
江西省 360000
山东省 370000
河南省 410000
湖北省 420000
湖南省 430000
广东省 440000
广西壮族自治区 450000
海南省 460000
重庆市 500000
四川省 510000
贵州省 520000
云南省 530000
西藏自治区 540000
陕西省 610000
甘肃省 620000
青海省 630000
宁夏回族自治区 640000
新疆维吾尔自治区 650000
台湾省(886) 710000
香港特别行政区(852) 810000
澳门特别行政区(853) 820000

由以上文本用字典解析式生成省级行政区划代码字典的python代码

provinceDict = {i.split()[1][:2]: i.split()[0] for i in provinceText.split('\n')} # 从文本生成编码和省中文名称字符对应字典。

  • 代码运行效果截屏图片
    在这里插入图片描述



Python代码


def getProvince(myId):''' 读取居民身份证行政省区划信息 '''provinceText = '''北京市 110000
天津市 120000
河北省 130000
山西省 140000
内蒙古自治区 150000
辽宁省 210000
吉林省 220000
黑龙江省 230000
上海市 310000
江苏省 320000
浙江省 330000
安徽省 340000
福建省 350000
江西省 360000
山东省 370000
河南省 410000
湖北省 420000
湖南省 430000
广东省 440000
广西壮族自治区 450000
海南省 460000
重庆市 500000
四川省 510000
贵州省 520000
云南省 530000
西藏自治区 540000
陕西省 610000
甘肃省 620000
青海省 630000
宁夏回族自治区 640000
新疆维吾尔自治区 650000
台湾省 710000
香港特别行政区 810000
澳门特别行政区 820000'''provinceDict = {i.split()[1][:2]: i.split()[0] for i in provinceText.split('\n')} # 从文本生成编码和省中文名称字符对应字典。#print(provinceDict) 调试用语句。return provinceDict.get(myId[:2])



回页目录



2.3 出生日期校验


  身份证编码中的出生日期是8位:年4位,月日各两位。首先校验年月日的合法性,即月份数字只可以是1~12,日只可以是1~月底(28、29、30、31);再就是合理性校验,比如输入未来的日期(年份不可以大于当前年,同年月份不可以大于当前月,同年同月,天数不可以大于当天),那就是不合理的。


  出生日期校验,难点在于校验生日当月天数,即身份证编码的第13、14位数字,不同月份最大数值不一样,分别是28、29、30和31。一般大小月份相对简把除2外的月份分大小月份两组,可以用成员关系符“in”判定是30还是31。2月比较特殊,涉及闰月(即公历闰年)判定来确定是28还是29。如果统一判定12个月,2月天数则需年月两个数据才可以,其它月份天数是固定不变的只要有月份数据就好。

  据此,我分别写了公历闰年判定函数,在该函数的助力下完成了公历12个月份最大天数的确定函数。为方便,我用lambda单行匿名函数关键字把这两个函数“浓缩”成了一行,如同一个变量。

两个“变量”似的单行匿名函数

leapyear = lambda year: (not year%4 and year%100) or not year%400 # 闰年判定单行匿名函数。isdays = lambda x: 31 if x[1] in (1, 3, 5, 7, 8, 10, 12) else 30 if x[1] in (4, 6, 9, 11) else 29 if leapyear(x[0]) else 28 # 根据年月计算公历某年某月有几天的单行匿名函。



  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      以上列举了拦截的部分不“合法”和不合理的出生日期输入。



Python代码

# 8生日字符串校验 #if not tyear < year or year == tyear and month > tmonth or (year == tyear and month == tmonth and day > tday):print(f"\n{' 出生日期错误!请查证。':~^29}\n\n{'(未出生的人怎么可以编码呢?):^27}")return Falseelif not 0 < month <= 12:print(f"\n{' 生日月份错误!请查证。':~^29}\n")return Falseelif not 0 < day <= isdays([year, month]):print(f"\n{' 生日号数错误!请查证。':~^29}\n")return False



回页目录



2.4 输入编码信息解析


  描述


  • 代码运行效果截屏图片



Python代码



回页目录



2. 次级灰色标题


  描述


  • 代码运行效果截屏图片



Python代码



回页目录


3、完整源码(Python)

(源码较长,点此跳过源码)



回页首


上一篇:  随机拆分红包金额(随机拆分给定金额为给定个数红包,像微信、QQ、支付宝随机红包那种,要求红包总金额绝对与给定金额相等)
下一篇: 



我的HOT博:

  本次共计收集289篇博文笔记信息,总阅读量44.72w。数据采集于2023年12月11日 23:07:13,用时5分11.8秒。阅读量不小于4.0k的有17篇。

    • ChatGPT国内镜像站初体验:聊天、Python代码生成等
      地址:https://blog.csdn.net/m0_57158496/article/details/129035387
      浏览阅读:6.2w
      点赞:127 收藏:809 评论:71
      (本篇笔记于2023-02-14 23:46:33首次发布,最后修改于2023-07-03 05:50:55)

    • 让QQ群昵称色变的神奇代码
      地址:https://blog.csdn.net/m0_57158496/article/details/122566500
      浏览阅读:5.8w
      点赞:24 收藏:86 评论:17
      (本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)

    • Python列表(list)反序(降序)的7种实现方式
      地址:https://blog.csdn.net/m0_57158496/article/details/128271700
      浏览阅读:9.9k
      点赞:5 收藏:30 评论:8
      (本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)

    • pandas 数据类型之 DataFrame
      地址:https://blog.csdn.net/m0_57158496/article/details/124525814
      浏览阅读:9.4k
      点赞:7 收藏:34 
      摘要:pandas 数据类型之 DataFrame_panda dataframe。
      (本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)

    • 个人信息提取(字符串)
      地址:https://blog.csdn.net/m0_57158496/article/details/124244618
      浏览阅读:7.7k
      摘要:个人信息提取(字符串)_python个人信息提取。
      (本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)

    • Python字符串居中显示
      地址:https://blog.csdn.net/m0_57158496/article/details/122163023
      浏览阅读:7.2k
      评论:1
    • 罗马数字转换器|罗马数字生成器
      地址:https://blog.csdn.net/m0_57158496/article/details/122592047
      浏览阅读:7.2k
      (本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)

    • 斐波那契数列的递归实现和for实现
      地址:https://blog.csdn.net/m0_57158496/article/details/122355295
      浏览阅读:5.6k
      点赞:4 收藏:2 评论:8
    • 回车符、换行符和回车换行符
      地址:https://blog.csdn.net/m0_57158496/article/details/123109488
      浏览阅读:5.5k
      点赞:2 收藏:3 
      摘要:回车符、换行符和回车换行符_命令行回车符。
      (本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)

    • python清屏
      地址:https://blog.csdn.net/m0_57158496/article/details/120762101
      浏览阅读:5.3k
    • 练习:字符串统计(坑:f‘string‘报错)
      地址:https://blog.csdn.net/m0_57158496/article/details/121723096
      浏览阅读:5.1k
    • 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
      地址:https://blog.csdn.net/m0_57158496/article/details/121645399
      浏览阅读:5.1k
      点赞:14 收藏:44 
    • 我的 Python.color() (Python 色彩打印控制)
      地址:https://blog.csdn.net/m0_57158496/article/details/123194259
      浏览阅读:4.6k
      点赞:2 收藏:8 
      摘要:我的 Python.color() (Python 色彩打印控制)_python color。
      (本篇笔记于2022-02-28 22:46:21首次发布,最后修改于2022-03-03 10:30:03)

    • 练习:生成100个随机正整数
      地址:https://blog.csdn.net/m0_57158496/article/details/122558220
      浏览阅读:4.6k
      (本篇笔记于2022-01-18 13:31:36首次发布,最后修改于2022-01-20 07:58:12)

    • 密码强度检测器
      地址:https://blog.csdn.net/m0_57158496/article/details/121739694
      浏览阅读:4.4k
      (本篇笔记于2021-12-06 09:08:25首次发布,最后修改于2022-11-27 09:39:39)

    • 罗马数字转换器(用罗马数字构造元素的值取模实现)
      地址:https://blog.csdn.net/m0_57158496/article/details/122608526
      浏览阅读:4.2k
      (本篇笔记于2022-01-20 19:38:12首次发布,最后修改于2022-01-21 18:32:02)

    • 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
      地址:https://blog.csdn.net/m0_57158496/article/details/124424935
      浏览阅读:4.0k
      摘要:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)_生日模拟问题,计算频率,并画出随着试验次数n的增大,频率和理论概率的 关系图。
      (本篇笔记于2022-04-26 12:46:25首次发布,最后修改于2022-04-27 21:22:07)


    • 推荐条件 阅读量突破4.0k
      (更多热博,请点击蓝色文字跳转翻阅)



      回页首


      老齐漫画头像

      精品文章:

      • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
      • OPP三大特性:封装中的property
      • 通过内置对象理解python'
      • 正则表达式
      • python中“*”的作用
      • Python 完全自学手册
      • 海象运算符
      • Python中的 `!=`与`is not`不同
      • 学习编程的正确方法

      来源:老齐教室


      ◆ Python 入门指南【Python 3.6.3】


      好文力荐:

      • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
      • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
      • 靠谱程序员的好习惯
      • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

      CSDN实用技巧博文:

      • 8个好用到爆的Python实用技巧
      • python忽略警告
      • Python代码编写规范
      • Python的docstring规范(说明文档的规范写法)

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283852.html

    如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imread’

    解决&#xff1a;AttributeError: module ‘scipy.misc’ has no attribute ‘imread’ 文章目录 解决&#xff1a;AttributeError: module scipy.misc has no attribute imread背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退&#xff08;不推荐&#…

    微机原理与接口技术——输入输出系统

    文章目录 一、端口的概念、分类二、端口的编址方式三、最常用的I/O指令1、直接寻址I/O指令&#xff08;八位端口地址&#xff09;2、DX间接寻址指令&#xff08;端口地址>8位&#xff09; 四、微机系统与I/O端口的信息交换图解无条件传送方式查询方式中断方式&#xff08;CP…

    01--二分查找

    一. 初识算法 1.1 什么是算法&#xff1f; 在数学和计算机科学领域&#xff0c;算法是一系列有限的严谨指令&#xff0c;通常用于解决一类特定问题或执行计算 不正式的说&#xff0c;算法就是任何定义优良的计算过程&#xff1a;接收一些值作为输入&#xff0c;在有限的时间…

    Google Gemini API快速上手(附申请步骤)

    前言 12月6日&#xff0c;谷歌发布新一代大模型Gemini的demo, 同时&#xff0c;Bard已将模型更新为Gemini Pro Gemini 是谷歌目前最新最强的大语言模型&#xff0c;支持多模态&#xff08;文字&#xff0c;图片&#xff0c;音频&#xff0c;视频等等&#xff09;处理 美国时…

    消息队列kafka详解:Kafka原理分析总结

    一、概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统&#xff0c;后成为Apache的一部分&#xff0c;它使用Scala编写&#xff0c;以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark等都支持与Kafka集成。 Kaf…

    Javaweb考前复习冲刺(不断更新版)

    Javaweb考前复习冲刺 第一章&#xff1a; JavaWeb 入门 JavaWeb是指&#xff1a;以Java作为后台语言的项目工程。 javaweb项目创建的过程&#xff1a; 首先集成Tomcat服务器环境新建dynamic web project部署工程运行 路由含义&#xff1a; ​ http://localhost:8080/工程…

    AI数字人直播问题及解决方案!

    青否数字人SaaS系统&#xff08;数字人源码&#xff1a;zhibo175&#xff09;目前支持哪些平台使用数字人直播 目前支持的平台有&#xff1a;抖音、快手、视频号、淘宝/天猫、京东、小红书、拼多多&#xff0c;哔哩哔哩&#xff0c;tiktok&#xff0c;阿里国际站&#xff0c;用…

    【改进YOLOv8】磁瓦缺陷分类系统:改进LSKNet骨干网络的YOLOv8

    1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来&#xff0c;随着智能制造产业的不断发展&#xff0c;基于人工智能与机器视觉的自动化产品缺陷检测技术在各行各业中得到了广泛应用。磁瓦作为永磁电机的主…

    Python PIP安装pycorrector、kemln报错

    本来想装个pycorrector用一下&#xff0c;结果在安装其依赖包kemln的时候疯狂报错&#xff0c;报错关键词包括但不限于Bash、Cmake&#xff0c;C啥的&#xff0c;搜了很多文章&#xff0c;终于摸索到了安装的办法。 1、安装bash 去官网https://gitforwindows.org/下载bash&am…

    ssm基于java web的计算机office课程平台设计与实现论文

    摘 要 使用旧方法对课程进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在课程的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的计算机office课程平台有管理员&a…

    2023云南爱心鸟暖冬公益——临沧322名山区孩子戴上爱心妈妈红围巾

    严冬来临&#xff0c;为了关爱高寒山区学校里的孩子们&#xff0c;2023年12月15日&#xff0c;云南爱心鸟联合送子鸟医院以及失独妈妈们共同开展了“爱心鸟暖冬红围巾”公益活动。他们收集了手织红围巾、保暖衣物和学习用品等爱心捐赠物资&#xff0c;为临沧永德县大雪山乡蚂蝗…

    倾斜摄影三维模型重建的几何坐标变换技术方法浅析

    倾斜摄影三维模型重建的几何坐标变换技术方法浅析 倾斜摄影三维模型数据的坐标变换是将相机坐标系下获取的倾斜摄影图像转换为地理坐标系下的三维模型数据&#xff0c;以实现地理空间信息的表达与分析。在实际应用中&#xff0c;需要进行坐标变换的主要包括航片图像、相机姿态参…