身份證最後一位校驗碼為什麼要設計成某些情況下是X呢,如果都是數字不是更方便處理嗎?
01-02
就像集裝箱號末尾的校驗碼。
校驗演算法是前17位每位數字 × 2 ^ n(n從右往左數1到17)之和然後 mod 11,其結果是0到10,分別對應10X98765432。從取模的角度講,通常總是取質數,而mod 7,只能用0-6,浪費了,所以選了11,就多了個X(即羅馬數字的10)。
要說也確實有點不便,不過從好的方面來說也提示你身份證不是純數字,免得小白程序員用int32保存結果出問題。
沒什麼不方便,只是對強迫症不友好。
科學一點說,這是一個國際標準,基本考慮有兩個:1. 十進位數字串的校驗碼不能小於10個,才能保證漢明距離大於等於2,才能排除單字錯誤。2. 不能與各位有公因數。即需要互質。以保證長度變化也能被檢查出來。
11是滿足兩個要求最小的數。身份證驗證演算法用的是mod11/2演算法。也就是2的i次冪的和第i位乘積的和對11取模。
2的冪對10取於只有2,4,8,6四種可能,取各個位數的乘積的和也必定是偶數,也就是說20%的重複可能,10個數字最多用到5個,這個顯然是過於浪費了。這個我覺得是沒有考慮到現在信息處理的需要,當時都是手工處理的,這麼設計沒有多大問題。
其實信用卡卡號用的校驗演算法就很好,完全是0到9中的一個數字,也可以做到發現一位數錯誤的效果。
沒有採用這個演算法,我估計同當時大環境有關?不想直接拿外國的來用,還是其他考慮,不得而知了前17位每位數字 × 2 ^ n(n從右往左數1到17)之和然後 mod 11。這麼說可以得出一個有意思的結論。。。因為前17位每位數字 × 2 ^ n(n從右往左數1到17)之和一定是偶數,偶數%11可能得0,2,4,6,8,10(也就是X),那麼最後一位只有可能是0,2,4,6,8,X了吧。。。利用率也不高
推薦閱讀:
※身份證複印件給別人怎麼避免安全問題?
※有沒有可能兩個人身份證號只差最後一個數字?
※請問身份證哪一面是正面?
※身份證號碼最後一位為什麼要出現X?
※僅憑藉身份證號碼可以識別一個人的性別嗎?
TAG:身份證 |