python 身份证号码验证和随机产生
2016-12-19 12:30
225 查看
身份证号的组成具体内容参考:
http://www.cnblogs.com/xudong-bupt/p/3293838.html
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
1、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。
2、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
3、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4、校验码计算步骤
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值(0~9)
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)
(2)计算模
Y = mod(S, 11)
(3)根据模,查找得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
这里把原文的js语言转为python语言以备将来使用:
可以用来做啥呢?比如随机产生一个身份证号码,需要获得地址码、生日、循序码、校验码,下面就依次叠加吧:
本文地址:https://github.com/HeLiangHIT/idCardNumber
http://www.cnblogs.com/xudong-bupt/p/3293838.html
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
1、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。
2、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
3、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4、校验码计算步骤
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值(0~9)
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)
(2)计算模
Y = mod(S, 11)
(3)根据模,查找得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
这里把原文的js语言转为python语言以备将来使用:
def getValidateCheckout(id17): '''获得校验码算法''' weight=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] #十七位数字本体码权重 validate=['1','0','X','9','8','7','6','5','4','3','2'] #mod11,对应校验码字符值 sum=0 mode=0 for i in range(0,len(id17)): sum = sum + int(id17[i])*weight[i] mode=sum%11 return validate[mode]
可以用来做啥呢?比如随机产生一个身份证号码,需要获得地址码、生日、循序码、校验码,下面就依次叠加吧:
def getRandomIdNumber(sex = 1): '''产生随机可用身份证号,sex = 1表示男性,sex = 0表示女性''' #地址码产生 from addr import addr #地址码 addrInfo = random.randint(0,len(addr))#随机选择一个值 addrId = addr[addrInfo][0] addrName = addr[addrInfo][1] idNumber = str(addrId) #出生日期码 start, end = "1960-01-01","2000-12-30" #生日起止日期 days = (datetime.datetime.strptime(end, "%Y-%m-%d") - datetime.datetime.strptime(start, "%Y-%m-%d")).days + 1 birthDays = datetime.datetime.strftime(datetime.datetime.strptime(start, "%Y-%m-%d") + datetime.timedelta(random.randint(0,days)), "%Y%m%d") idNumber = idNumber + str(birthDays) #顺序码 for i in range(2):#产生前面的随机值 n = random.randint(0,9)# 最后一个值可以包括 idNumber = idNumber + str(n) # 性别数字码 sexId = random.randrange(sex,10,step = 2) #性别码 idNumber = idNumber + str(sexId) # 校验码 checkOut = getValidateCheckout(idNumber) idNumber = idNumber + str(checkOut) return idNumber,addrName,addrId,birthDays,sex,checkOut
本文地址:https://github.com/HeLiangHIT/idCardNumber
相关文章推荐
- 随机产生一个类似身份证号码的18位字符串
- python写的随机生成身份证号码的函数
- 自定义RFS关键字库中的关键字(使用python随机生成身份证号码)
- Python 随机生成有效手机号码及身份证
- Python3 生成随机身份证号码
- Python实现随机生成有效手机号码及身份证功能示例
- IP查询、手机号码归属地、邮政编码、长途电话区号、身份证号码验证专业在线查询
- JavaScript 验证身份证号码真伪
- 身份证号码验证函数
- 身份证号码验证代码集合(js)
- 身份证号码验证正则表达式
- javascript身份证号码验证函数支持带x
- 身份证号码验证-支持新的带x身份证
- 15位, 18位的身份证号码的验证函数.以及根据身份证取省份,生日,性别
- 产生随机验证图片代码来自CNBlogsDottext10Beta2
- 验证类,包括手机号码验证,身份证验证,IP,时间,表单,浏览器,EMAIL等等,非常有用!!!
- 身份证号码验证脚本函数
- javascript身份证号码验证函数支持带x
- 身份证号码验证web服务
- 身份证号码验证脚本函数