验证身份证号的Python脚本
中国的居民身份证有18位。其中前17位是信息码,最后1位是校验码。每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10。身份证校验码算法:
设18位身份证号序列从左到右为:
引用
a, a, a, a, ..., a, a
其中a表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a=10
每一位被赋予一个“权值”,其中,第i位的权值w的计算方法是:
引用
w = 2**(17-i) % 11
其中,i=0,1,2,3,...,17,运算符按Python惯例:x**y表示x的y次方,x%y表示x除以y的余数。
如果一个身份证号是正确的,那么:
引用
(a*w + a*w + a*w + ... + a*w + a*w) % 11 == 1
实际上,校验位a的计算方法,就是巧妙地选择一个值使得上式成立。
根据上述算法,下面是一个验证身份证号正确性的程序。
可以通过命令行输入。第一个命令行参数是身份证号。输出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
def verify_string(s):
char_list = list(s)
num_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)
if result:
print "Valid"
else:
print "Invalid"
命令行使用举例:
引用
$ python shenfenzheng.py 320105198209275127
Valid
页:
[1]