基于可视化结构的身份证号码校验系统
摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在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.
来源:CSDN
作者:qq_2649825643
链接:https://blog.csdn.net/qq_36016038/article/details/104455328