以前浏览网站时,偶尔会发现有些网站注册时需要填写身份证,而且对身份证检验相当严格,猜想必定存在某种算法。今天恰好有空,上网找了一下,有些收获,不敢独享,现与众网友共享。本人已将算法用C#实现,希望大家能多多指点。

1.         中国公民身份证常识:

我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。

GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。

6行政区划分代码

6位出生日期

3位顺序

 

       GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

6位行政区划分代码

6位出生日期

3位顺序码

1位校验码

       行政区划分代码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。

       行政区划分代码国家标准GB T 2260-1999

       出生日期码:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。

       顺序码:表示同一地址码所标识的区域范围内,对同年、同月、同日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。

    校验码:是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

2.         算法

关于身份证号码最后一位的校验码的算法如下:

假设最后一位的校验码为R

C=(a[i]*w[i])%11 (i=2,3,…,18)

其中∑:表示求和

i:表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧位1

*:表示乘号

a[i]:表示身份证号码第i位上的号码

w[i]:表示第i位上的权值,计算方法:w[i]=2^(i-1)%11

%:表示求模运算

^:表示求幂运算

经过上述方法得到的C的范围在0~10之间,它与身份证最后一位校验位的对应规则为:

C

0

1

2

3

4

5

6

7

8

9

10

R

1

0

X

9

8

7

6

5

4

3

2

由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X

3.         C#实现

.Empty;
        }
    }
}

我们可以直接执行方法Zwf.IdCard.Check.CheckCard(身份证号码)进行验证身份证是否正确

该方法返回true表示身份证号码合法,false表示身份证号码不合法。

写得比较粗糙,还望各位高人多指点。

4.         参考资料

"将15位身份证转换为18位身份证":http://www.joyblog.cn/article.asp?id=105

相关文章: