為何身份證的最後一位的演算法要如此設計?
01-21
現在大家都知道身份證的最後一位是根據前面的位數計算出來的校驗碼。
但是這一位具體是怎樣算出來的呢?為何設計演算法的時候要使得最後一位有0~9,X這11種可能。設計成只有0~9不可以嗎?這樣設計多了一個字母,顯然是不經濟的。這是一個設計缺陷嗎?
因為校驗演算法涉及兩次mod 11的過程,具體的演算法一搜一大把,很簡單,不贅述。為什麼要mod 11呢?因為mod 10的話不能保證校驗作用,當加權因子是偶數的時候,那麼這一位的數字相差5的時候就不能識別。比如第五位加權因子是8,3 * 8 mod 10 = 8 * 8 mod 10=4,則第五位如果由3誤寫成8的話,就校驗不出來。至於更小的就更不行了,比如9的話任何一位差9也校驗不出來。所以,這個數總結起來的要求就是:不能有大於1小於10的因數……那最小的只有11了。
首先,這套校驗碼計算方法不但沒有題主說的缺陷,反而很科學。
它能檢查出下列錯誤:1、所有的單一字元替換錯誤(如1234被錯錄為4234)2、所有的或幾乎所有的單一字元對換位置錯誤(如12345被錯錄為12354)3、所有或幾乎所有的循環位移錯誤(如123不錯錄為0123)4、大部分的雙替換錯誤(如1234567被錯錄為7234587)
再說說題主問的校驗碼為什麼是0-,9加上X而不是0-9
因為是對11進行求餘數而不是對10求餘數,如果是對10求餘數那麼校驗碼可以是0-9,但是對11求餘數,當餘數是10時,因為校驗碼必須是一位,所以才用羅馬數字X代表10我在知乎專欄有一篇關於身份證號碼編碼規則的文章,可以看下實名認證前傳之身份證號碼編碼規則 - 支付結算雜談 - 知乎專欄一、15位身份證號碼組成:6位地區代碼+6位出生年月日(yymmdd 如491001)+3位出生序號(當天該地區出生的序號,奇數男性偶數女性),沒有檢驗碼;
18位身份證號碼組成:6位地區代碼+8位出生年月日(yyyymmdd 如19801001)+3位出生序號+1位校驗碼。
二、校驗碼取值範圍:{0~9,X};X其實不是字母,是羅馬數字10;前17位根據數學公式運算出來的任何結果,模11(即除11取餘數)分布在0~10之間;具體公式詳見下方。我認為如果非要使用字母做校驗碼,不如號碼本身也用字母,如字母表示省份、年月日等,這樣能大大縮短身份證號碼長度。如身份證使用數字,那麼校驗碼也應使用數字,若1位校驗碼不夠可以使用2位數作校驗碼,於是身份證號可表示為整數。不管哪種方法,都比現在這樣好。
推薦閱讀: