验证身份证号的Python脚本

中国的居民身份证有18位。其中前17位是信息码,最后1位是校验码。每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10。

身份证校验码算法:

设18位身份证号序列从左到右为:
[quote]a[0], a[1], a[2], a[3], ..., a[16], a[17][/quote]
其中a[i]表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a[17]=10

每一位被赋予一个“权值”,其中,第i位的权值w[i]的计算方法是:
[quote]w[i] = 2**(17-i) % 11[/quote]
其中,i=0,1,2,3,...,17,运算符按Python惯例:x**y表示x的y次方,x%y表示x除以y的余数。

如果一个身份证号是正确的,那么:
[quote](a[0]*w[0] + a[1]*w[1] + a[2]*w[2] + ... + a[16]*w[16] + a[17]*w[17]) % 11 == 1[/quote]

实际上,校验位a[17]的计算方法,就是巧妙地选择一个值使得上式成立。

根据上述算法,下面是一个验证身份证号正确性的程序。
可以通过命令行输入。第一个命令行参数是身份证号。输出Valid或Invalid。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

USAGE="""\
USAGE: python shenfenzheng.py shenfenzhenghao
"""

chmap = {
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,
'x':10,'X':10
}

def ch_to_num(ch):
return chmap[ch]

def verify_string(s):
char_list = list(s)
num_list = [ch_to_num(ch) for ch in char_list]
return verify_list(num_list)

def verify_list(l):
sum = 0
for ii,n in enumerate(l):
i = 18-ii
weight = 2**(i-1) % 11
sum = (sum + n*weight) % 11

# print "i=%d,weight=%d,n=%d,sum=%d"%(i,weight,n,sum)

# print sum
return sum==1

if __name__=='__main__':
import sys
if len(sys.argv)!=2:
print USAGE
sys.exit(1)
result = verify_string(sys.argv[1])
if result:
print "Valid"
else:
print "Invalid"


命令行使用举例:
[quote]
$ python shenfenzheng.py 320105198209275127
Valid
[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值