中国开发网: 论坛: 程序员情感CBD: 贴子 311600
haitao
身份证的最后一位为什么会出现X
--是啊,为了提高校验能力,却付出了编码字符集增大的代价
--本来每一位都是0-9,现在是前17位是0-9,最后一位是0-9,x,这算什么事呢!!



身份证的最后一位为什么会出现X
0 Comments
这个东西是个以11为模的校验码,不使用10为模的原因很简单:
作者:荒唐
时间:2006-03-16 18:03 三思科学论坛(http://bbs.oursci.org)

如果使用10为模,那么除了身份证的末位(非校验位的末位)之外,其他任何一位加5或者
减5,是检查不出来的。任何多位随机错误,被漏检的概率都是1/5(严格地说稍微低于
1/5,因为末位数字被漏检的概率是1/10)。

使用11为模,任何单个的一位数字发生了差错,都必定能够被检查出来。任何多位随机错
误,被漏检的概率都能达到1/11。

其中的原因很简单,11是素数,而且跟2互素(这个2的作用在后面会讲到)。这个模必须不
小于10,否则对一位数取模都会出现重复,肯定不能100%地检查出单个位错。满足这个的最
小数字就是11了。

不过在我看来,这个做法也很无聊,既然都使用了一个X,为什么不多用几个呢?这样可以
用31甚至37做模(用37的话除了字母数字还需要一个额外的符号)。不过这个我说了不算,
据说是一种很古老的普遍使用在印刷品上的校验码计算方法

身份证的校验算法是这样的:

假设身份证号码为X(0) X(1) X(2) X(3) … X(17)(共18位,包括最后一位校验位)
S(0) = 0
S(i+1) = S(i)*2 + X(i) mod 11
S(18)就是最终的校验和,但是注意这个校验和并不是身份证的末位数,只是用来检查身份
证号码是否有错。这个校验和必须等于1。也就是说,必须设法调整X(17)的值,使S(18)等
于1。
如果你想要根据身份证的前17位求出校验位,那么你可以根据前17位计算出S(17),那么末
位数X(17)可以这样求出来:
X(17) = 1 - 2*S(17) mod 11
%就是C语言的求模运算

如果S(18)等于10,就用X来代替。
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录