`
cloverprince
  • 浏览: 126866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

验证身份证号的Python脚本

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

身份证校验码算法:

设18位身份证号序列从左到右为:
引用
a[0], a[1], a[2], a[3], ..., a[16], a[17]

其中a[i]表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a[17]=10

每一位被赋予一个“权值”,其中,第i位的权值w[i]的计算方法是:
引用
w[i] = 2**(17-i) % 11

其中,i=0,1,2,3,...,17,运算符按Python惯例:x**y表示x的y次方,x%y表示x除以y的余数。

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


实际上,校验位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"


命令行使用举例:
引用

$ python shenfenzheng.py 320105198209275127
Valid
分享到:
评论
1 楼 lseeo 2009-09-09  
非常不错!

相关推荐

Global site tag (gtag.js) - Google Analytics