基于可视化结构的身份证号码校验系统

摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果。系统通过运用基础GUI库tkinter创建系统兼容性极高的可视化界面。通过数据结构算法对身份证号码进行分析和计算,最终输出由身份证号得到的身份信息,同时如果信息有误,系统会通过可视化界面进行提示。同时系统还具有程序简洁,灵活,执行效率高等众多优势。
关键词: 身份证校验;可视化;

1 问题描述:

二代身份证作为证明公民身份的证件,身份证号码是独一无二的编号,因此根据身份证号码校验身份证的真伪尤为重要。校验身份证号码真伪应该符合以下设计要求:
(1)身份证号码长度的正确性
(2)身份证号码的合法性
拟设计的身份证号码的校验系统,不仅可以做到校验身份证号码的长度是否正确,校验身份证号码的合法性,还可以识别出生年月、籍贯、性别等信息。

2 系统设计

2.1设计原理

根据中华人民共和国国家标准 GB11643-1999 中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照 ISO 7064:1983.MOD 11-2 校验码计算出来的检验码。最后一位的校验码尤为重要。

公式(1)中: 表示号码字符从右至左,包括校验码在内的位置序号; 表示第 位置上的号码字符值; 表示第 位置上的加权因子,其数值可依据公式 计算得出。号码字符及对应的加权因子如表1分布所示:

  • 表1 号码字符及对应的加权因子
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
W 7 9 10 5 8 4 2 1 6 3 7 9 10 5 4 3 2 1

按公式(1)来计算,只要最后的加权和除以11,余数只要能和表2校验码查询表相对应,那么身份证号码就是正确的。

  • 表2 校验码查询表
0 1 2 3 4 5 6 7 8 9 10
1 0 x 9 8 7 6 5 4 3 2

注:X表示计算结果为10。

2.2.功能模块设计

功能模块设计如图1所示,主要包含可视化界面模块及数据处理模块。其中可视化界面模块又可分为输入提示窗口、信息显示窗口两大组成。数据处理模块包括有数据读取、数据拆分及算法处理等组件构成。

图1系统功能模块图


主程序窗口负责记录并显示用户输入的身份证号码,同时为用户提供操作按键及操作提示。

系统将用户输入的身份证号码读取并经过算法处理后,经由校验结果显示窗口进行交互显示,通过窗口可以清晰的看到身份证号码是否合格,若合格则可以得到正确的身份信息。

2.3.数据结构设计

系统为用户输入的身份证号码定义了列表结构,得到的身份证号形式如下:
** id_num = [‘3’,’4’,’0’,’4’,’2’,’1’,’1’……] **
对于可视化界面的输出数据格式皆以字符的形式表示,一方面字符比较方便拼接,同时可以兼容多种符号及语言。另一方面采用字符的形式进行可视化的界面显示设计,可以有效的防止数据在传输过程中发生变形。
在进行籍贯信息读取计算时,籍贯表格通过字典的形式进行存储,程序可以直接通过对字典的检索直接得到相应的籍贯信息。籍贯字典形式如下:
prov_list = {“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”: “国外”}

2.4.函数功能描述

def exit_gui(): 退出系统函数,执行此函数将会退出该系统。
def math(): 数据处理函数,对输入的身份证号码进行数据分析,最终输出相应的身份信息数据。
def id_check_ui (birth_num, add, sex, check): 可视化界面函数,将经过分析的身份信息显示出来。
def get_id_born_year(id_birth): 通过输入的部分身份证号码,获取出生日期并返回。
def get_id_pro(id_add): 通过输入的部分身份证号码,获取籍贯信息并返回。
def get_id_sex(id_sex): 通过输入的部分身份证号码,获取性别信息并返回。
def get_id_ecc(id_num): 通过输入的部分身份证号码,计算出校验位信息并返回。
myWindow.mainloop() 进入窗口循环(程序入口)

3 详细设计(程序源码)

"""
程序说明:     读取用户输入的身份证号码,并判断号码是否合法,若合法则显示身份信息,不合法则提醒用户。
Author:       张海涛
Specification:  遵循 PEP-257 规则
Modify:       2019-09-16
"""
# -*- coding: utf-8 -*-
# 导入GUI编程基础库-tkinter
import tkinter as tk
# 获取函数文件的绝对路径root_path,并导入。
import os
current_path = os.path.abspath(__file__)
root_path = os.path.abspath(os.path.dirname(current_path) + os.path.sep + ".")
import sys
sys.path.append(root_path)
# 导入算法文件
import function.mathfunction as mathfunction# 创建一个主程序窗口
myWindow = tk.Tk()
# 设置窗口的标题
myWindow.title('身份证校验')
# 设置窗口大小
myWindow.geometry('300x300')# 导入提示标签
input_lab = tk.Label(myWindow, text="请输入您的身份证号码 :")
# 确定提示标签位置和大小
input_lab.place(x=50, y=10, width=150, height=50)"""
函数说明:将身份信息以可视化的形式显示在屏幕上
Parameters: birth_num - 出生日期、add - 籍贯信息sex - 性别信息check - 检验位信息
Returns:    无
Modify:     2019-09-16
"""
def id_check_ui(birth_num, add, sex, check):# 创建一个信息显示窗口view = tk.Tk()# 设置窗口的标题view.title('身份证信息显示窗口')# 设置窗口大小view.geometry('300x300')# 导入年龄标签框birth_num_lab = tk.Label(view, text="出生日期:")# 确定年龄标签位置和大小birth_num_lab.place(x=10, y=20, width=60, height=30)# 将身份证号码中提取到的年龄信息打印到文本框birth_num_txt = tk.Text(view)birth_num_txt.place(x=80, y=25, width=200, height=20)birth_num_txt.insert('insert', birth_num)# 导入籍贯标签框add_lab = tk.Label(view, text="籍贯:")# 确定籍贯标签位置和大小add_lab.place(x=10, y=60, width=60, height=30)# 导入籍贯文本框add_txt = tk.Text(view)# 导入籍贯文本框位置与大小add_txt.place(x=80, y=65, width=200, height=20)# 导入籍贯文本框中的数据add_txt.insert('insert', add)# 导入性别标签框sex_lab = tk.Label(view, text="性别:")# 确定性别标签位置和大小sex_lab.place(x=10, y=100, width=60, height=30)sex_txt = tk.Text(view)sex_txt.place(x=80, y=105, width=200, height=20)sex_txt.insert('insert', sex)# 导入校验结果标签框sex_lab = tk.Label(view, text="校验结果:")# 确定校验结果标签位置和大小sex_lab.place(x=10, y=140, width=60, height=30)sex_txt = tk.Text(view)sex_txt.place(x=80, y=145, width=200, height=20)sex_txt.insert('insert', check)def math():# 在主程序窗口添加提示标签prompt_lab1 = tk.Label(myWindow, text="正在校验 :")prompt_lab1 .place(x=50, y=200, width=150, height=50)# 获取输入的身份证号码id_num = Input_num.get()print(id_num)if len(id_num) != 18:prompt_lab1 = tk.Label(myWindow, text="您输入的号码长度有误 :", fg='red')prompt_lab1 .place(x=50, y=200, width=150, height=50)return 0# 将获取到的身份证号码进行拆分处理,方便后期运算id_add = id_num[0:6]id_birth = id_num[6:14]id_sex = id_num[14:17]id_check = id_num[17]# 计算身份证号码中的出生日期birth_num = mathfunction.get_id_born_year(id_birth)print(birth_num)# 计算身份证号码的籍贯信息add = mathfunction.get_id_pro(id_add)print(add)# 计算身份证号码的性别信息sex = mathfunction.get_id_sex(id_sex)print(sex)# 计算身份证号码的校验位信息 校验数学用语(ECC)check_num = mathfunction.get_id_ecc(id_num)print(check_num)if id_check == check_num:check = '校验成功'else:check = '校验失败'print(check)# 调用UI显示函数将身份信息显示出来
id_check_ui(birth_num, add, sex, check)"""
函数说明:    退出系统
Parameters:   无
Returns:      无
Modify:     2019-09-16
"""
def exit_gui():sys.exit()# 导入按键1,当按键1按下将会调用 hit_me 函数
Button1 = tk.Button(myWindow, text="校验", bg='yellow', command=math)
# 确定按键1位置和大小
Button1.place(x=50, y=120, width=60, height=50)
# 导入按键2,当按键2按下将会调用 exit_gui 函数
Button2 = tk.Button(myWindow, text="退出", command=exit_gui)
# 确定按键2位置和大小
Button2.place(x=160, y=120, width=60, height=50)
# 放置输入模块
Input_num = tk.Entry(myWindow, show=None)  # 输入全部正常显示
Input_num.place(x=30, y=70, width=200, height=30)# 启动窗口循环
myWindow.mainloop()

参考文献

[1] 曾浩.界面程序开发应用技术[J].科教文汇,2010(10):87-89.
[2] 邱道尹.基于MATLAB的身份证号码的识别算法[N].华北水利水电学院学报,2012-4-2(2).
[3] 齐鹏.基于的Web数据采集技术[J/OL].电子科技,2012-11-05.
[4] 魏锐.用C++Builder实现身份证15位升18位的算法[J].天中学刊,2007(10):54-55.
[5] 李文宏.基于冗余位校验及信息对比的身份证号纠错方法[J].中国人民公安大学学报,2012(2):87-90.
[6] 申习身.使用Excel验证身份证号校验码的设计方法[J].天津联合职业院校联合学报,2014(2):65-67.
[7] 龙相明.用自定义函数校验与获取身份证数据[J].电脑编程技巧与维护,2014(5):106-107.
[8] 朱健.移动端身份证号码识别算法实现[J].软件导刊,2019(7):71-73.

基于可视化结构的身份证号码校验系统-树莓派实现相关推荐

  1. 【身份证识别】基于形态学实现二代身份证号码识别系统matlab源码含GUI

    一.简介 首先从身份证图像上获取0-9和X共十一个号码字符的样本图像作为后续识别的字符库样本,其次将待测身份证图像进行去噪.灰度化.二值化.水平投影切割,垂直投影并切割,将待测身份证号码分割出来,然后 ...

  2. 用python实现身份证号校验系统

    使用Tkinter作为GUI模块以及python基础,开发一款身份证号码校验的系统. 功能概览: 用户输入身份证号码 从身份证号码得到该用户的地区信息.出生日期.以及身份证号码是否合法 Tkinter ...

  3. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  4. java版本身份证号码校验与卫语句

    最近在公司做项目时,有一个小功能点就是身份证号码校验,即判断是否是合理的身份证号码.不想重复造轮子,想着公司的一些基础组件可能有这个功能,一找还真有,原作者代码逻辑应该是正确的,但是风格有点呵呵了,各 ...

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

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

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

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

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

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

  8. validate格式校验之身份证号码校验

    //校验身份证号码 function isIdCardNo(num) {     var factorArr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5 ...

  9. vue身份证号码校验

    一.vue身份证号码校验? let checkRegNo = (rule,value,callback) => {     setTimeout(() => {         const ...

最新文章

  1. 实例代码分享Python实现Linux监控
  2. Select()系统调用及文件描述符集fd_set的应用
  3. hadoop程序开发 --- python
  4. lightoj-1028 Trailing Zeroes (I)
  5. Python常见问题(1):来历与简介General Python FAQ
  6. 2016计算机课程设计,2016年计算机组成原理课程设计-硬布线控制器的设计.doc
  7. 分割视图控制器(UISplitViewController)
  8. python signal模块作用_如何理解python中信号Signal?
  9. 本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵
  10. idea lombok 离线安装_Lombok与IntelliJ IDEA干了一架,完胜
  11. Nacod服务注册与发现(AP架构)、心跳检查机制
  12. 02-06 Python库-random
  13. VMware下虚拟系统上网与互ping
  14. 编译原理完整学习笔记(七):优化代码
  15. python3之环境搭建以及基础语法
  16. 计算机本地无法连接失败怎么办,本地连接连不上,小编教你电脑本地连接连不上怎么解决...
  17. DTL(Django templeate language)
  18. 三种语句可以恢复Oracle数据库误删除数据
  19. 网线的制作及交换机的基本配置
  20. 教授专栏33 | 黄阳光: 投资初创企业,应如何配置资源?

热门文章

  1. R语言使用pbern函数生成伯努利分布(0-1分布)累积分布函数数据、使用plot函数可视化伯努利分布累积分布函数数据( Bernoulli distribution)
  2. 在ESP8266上控制WS2812灯带及热释电传感器原码
  3. Java 保存带Clob字段的数据
  4. 通俗易懂地说明「面向对象」和「面向过程」的区别
  5. 用身高和/或体重数据进行性别分类
  6. Android 蓝牙自动匹配PIN码跳过用户交互
  7. 【实战】(以色列·特拉维夫大学)将 E4E 成功移植到Windows 10: StyleGAN2图像处理编码器的设计,支持Pytorch Cuda/C++ Extension
  8. 那一天,被Redis主从架构支配的恐惧
  9. 计算机网络OSI七层协议
  10. MQ-7一氧化碳传感器模块功能实现(STM32)