当前位置: 华文问答 > 数码

身份证号的末位校验码算法最后一步模11是基于什么考虑?

2012-04-28数码

甲:「你今儿发生什么事儿了,那么难过?」

乙:「我帮人家办事,抄了身份证号后人家离开了,然后打在电脑里提示这是不正确的身份证号,怀疑是不是抄错了。现在还在想办法联系人家……」

甲:「我看看哈……肯定是错的。」

乙:「你怎么也知道?」

甲:「十八位的号码,真正记录信息的是前十七位,最后一位是帮你检查有没有错。」

乙:「还在想这为什么如此灵光,幸亏电脑能提醒,要不然一个错的号码输进去出了事就完蛋了。」

甲:「我们经常碰到的错号无非就是两类:一是 该位的数字错了 ,二是 两位或多位的数字顺序错了 。」

乙:「您说说这两种方法是怎么解决的?」

甲:「您老人家笔算验算时有没有用过 弃九法 啊?」 (可能有些人在这里没看懂,我在这里添加了链接。)

乙:「用过哈,比如我算 2,017-1,949=68,将 2,017 各位相加得 10,减掉 9 为 1;1,949 去掉两个 9 后各位相加得 5。」

甲:「那么该怎么算呢?」

乙:「1-5=-4,然后不在 0~8 之间的数要不断加减 9,这样变成 -4+9=5。结果的 68 两位相加得 14,减掉 9 变 5,那么 5=5 说明验算正确。」

甲:「看来你也对这方面有些了解啊。 可是有没有想过,如果有几位数字正好颠倒了顺序呢? 比如你把 2,017 写成 2,107,用弃九法能检查出来吗?」

乙:「这……不好说吧,不过我还是想了解下。」

甲:「那么我们可以给每位的数字乘上指定的不同的数字。比如三位数,百位乘 4、十位乘 2、个位乘 1,再相加。」

乙:「我看看啊:对于 123,算出来是 9;对于 321,算出来是 17……挺灵的!」

甲:「既然你知道了笔算验算的弃九法,那么也不难理解, 校验码有点像弃九法里的那位数字,只是还得给每位乘上指定数字,然后最后除的数字可能不是 9,可能是其他的数字来取其余数。

乙:「那么身份证号又是怎样的呢?」

甲:「这样,你现在有 18 位号码,你假设不知道最后一位,把它记为 n。」

乙:「嗯,每位乘多少?」

甲:「从最后一位开始乘以 1,倒数第二位乘以 2,倒数第三位乘以 4……倒数第 n 位乘以 2^{n-1} 。」

乙:「打住,最左边的一位岂不是要乘以 2^{17}=131,072 了?」

甲:「不急,到时候有简化的算法。把上述的数值乘好,相互间加好后, 我们要除以 11 了。

乙:「这个 11 有什么讲究?」

甲:「你先想想看,如果除以 10 以内的数会发生什么后果?」

乙:「让我想想……就拿 7 吧,比如我把其中一位的 1 错填成 8 ,校验码 n 就不会发生变化,所以检查不出错误。」

甲:「正确,想想那么除以 10 呢?」

乙:「好像不容易想出来。」

甲:「我们这里选择了每位乘上 2^{n-1} ,而 10=2×5。」

乙:「所以呢?」

甲:「先不看校验码所在位,其他位的数字经计算都是偶数了。」

乙:「那么校验码也只能是偶数了?」

甲:「恭喜你答对了!那么我们就选择除以 11 吧,它与 2 的整数次幂无关,且会有 0~10 这 11 种结果,其中 10 用罗马数字 X 来表示。」

乙:「怪不得这个 X 好神秘,还以为是特工的身份证号……」

甲:「说了这么多了,我这里有简化算法,本质是将 2^{n-1} 对 11 取模,这里的 a_n 仍旧是从右往左的第 n 位:」

7(a_{18}+a_8)+9(a_{17}+a_7)+10(a_{16}+a_6)+5(a_{15}+a_5)

+8(a_{14}+a_4)+4(a_{13}+a_3)+2(a_{12}+a_2)+a_{11}+6a_{10}+3a_{9}

乙:「公式里的 a_1 呢?」

甲:「这不就是你要算的 n 吗?然后你要除以 11,得到 0~10 的余数。」

乙:「让我算算……算出来是 9,可是我身份证号最后一位数是 3 啊。」

甲:「还有一步,用 12 减该余数,得到 2~12 的数字,最后 10→X、11→0,12→1。」

乙:「呼……终于算好了,果然如此。」

甲:「你那个错误的号给我,我看看问题在哪。」

乙:「不知道哪位错了,不过最后一位我没填错。」

甲:「我看下……信息里的地址对的,生日对的…… 你是不是把倒数第二位的 6 填成 9 了?!

乙无言。

附:身份证校验码简明算法

第一步: 将前 17 位依次填入下面的方框,完成算式:

7\times□+9\times□+10\times□+5\times□+8\times□+4\times□

+2\times□+1\times□+6\times□+3\times□

+7\times□+9\times□+10\times□+5\times□

+8\times□+4\times□+2\times□

(为便于观察,算式分为四行:地址、出生年、生日、序列性别)

第二步: 上式计算得出的数值,除以 11,取其余数;

第三步: 用 12 减去该余数,如果结果在 2~10 之间,则该结果即为校验码 (注意 10 用罗马数字 X 表示) ;如果结果为 11、12,则再减去 11,最终得到的 0、1 即为校验码。