這是一張目前通行的第二代居民身份證,有國徽的這面是正面,有個人信息的是反面,底部這串 18 位的編碼是身份證號。
(相關資料圖)
從左到右前 6 位數是地址碼,參考行政區劃代碼,依次代表省級、市級、縣級所在地區。
不過,由于行政區劃代碼曾多次修訂,哪怕來自同一個地方,身份證上這 6 位也可能不一樣。
隨后 8 位數字是出生日期碼,接下來的 3 位是該日期出生嬰兒的順序碼,在 000 到 999 之間,偶數被分配給女性,奇數被分配給男性。
那么,最后一位代表什么?為什么有人是數字,有人是 X 呢?
前 17 位數字說盡了身份證主人的出生地、年齡和性別,而最后的字母并不攜帶實質信息,它是額外添加的校驗碼。
當我們手動輸入身份證號,除了多一位、少一位這種比較明顯的失誤,可能難以發現自己輸錯了。
而身份證最后一位的校驗碼可以快速檢測出這些錯誤,系統往往會彈出提醒,讓用戶重新輸入:
那么,校驗碼是怎么發現身份證格式錯誤的?
身份證最后一位校驗碼數值通過 MOD 運算得出,通過代入身份證前 17 位數字,計算出最后 1 位校驗碼,采用的算法是 MOD 11-2。
具體公式長這樣:
這是一個求余公式,a? 和 W? 的乘積之和除以 11,余數是 1。
i 代表身份證號從右到左的位置序號,a? 對應第 i 位置上的身份證數字,它們都為 0 到 10 之間的整數。現在以這個身份證號為例,計算一下 a 的數值。
公式中的 W? 以 2 為基數,由另一個公式求余算出。根據公式,把所有 a? 和 W? 的數值相乘,再將乘積相加除以 11,已知余數為 1,由此可以計算出此處 a 的值是 10。
也就是說,這個身份證號最后 1 位應該是 10,但直接用數字 10 會讓號碼從 18 位變成 19 位,因此用羅馬數字 X 來替代 10。
身份證號最后一位 1-X 校驗碼都由此公式算出,如果你的身份證號出現 X,說明根據前 17 位計算出的數值剛好為 10。
X 的存在解決了位數的問題,但有可能給身份證主人帶來煩惱,比如一些網站將身份證號的后 6 位作為初始密碼,卻不支持輸入字母。
既然 10 這么麻煩,為什么不干脆去掉它,把校驗碼的范圍限定在 0 到 9 呢?這是因為 MOD 11 算法識別各類錯誤的概率都在 90% 以上,MOD 10 算法則無法保證如此高的識別率。
不止身份證號里有校驗碼,日常許多編碼都會用到,但計算校驗碼的方法各異。比如,法人和其他組織統一社會信用代碼用的是 MOD 31-3 算法,需要除以 31 取余數,得到的校驗碼在 0 到 30 之間,大于等于 10 的數字用英文字母代替。
商品條碼的校驗碼算法則不涉及余數,通過加減計算得出。
我們每天都要用到的二維碼(QR Code),則用到了更為復雜的里德 - 所羅門編碼,通過它生成的碼,已經超越了普通校驗碼 " 發現錯誤 " 的層次,上升到能 " 糾正錯誤 " 的 level。
糾錯級別最高的一款,就算碼上高達 30% 的信息無法識別,依然可以還原出完整信息。
身份證號末尾的數字和 X 是與主人沒有關系的信息,但作為校驗碼中的一員,它僅有的一個字節隱藏著一連串的計算,在你輸錯時彈窗提醒,悄悄地刷一把公式的 " 存在感 "。
你認識身份證號自帶 X 的人嗎?歡迎在評論區和我們交流。
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-06
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-05
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04
頭條 22-11-04