當前位置: 華文問答 > 數碼

身份證號的末位校驗碼演算法最後一步模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 即為校驗碼。