複製鏈接
請複製以下鏈接發送給好友

身份證校驗碼

鎖定
身份證號碼中的校驗碼是身份證號碼的最後一位,是根據GB 11643-1999中有關公民身份號碼的規定,根據精密的計算公式計算出來的,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼,最後一位是數字校驗碼。
中文名
身份證校驗碼
概    念
身份證號碼的最後一位
根    據
GB 11643-1999
最後一位
數字校驗碼

身份證校驗碼依據

身份證最後一位是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。作為尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,如果某人的尾號是0-9,都不會出現X,但如果尾號是10,那麼就得用X來代替,因為如果用10做尾號,那麼此人的身份證就變成了19位,而19位的號碼違反了國家標準,並且我國的計算機應用系統也不承認19位的身份證號碼。Ⅹ是羅馬數字的10,用X來代替10,可以保證公民的身份證符合國家標準。

身份證校驗碼計算方法

1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、將這17位數字和係數相乘的結果相加;
3、用加出來和除以11,看餘數是多少;
4、餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最後一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
5、通過上面得知如果餘數是2,餘數所對應的最後一位身份證號是X,就會在身份證的第18位數字上出現羅馬數字的X。
例如:某男性的身份證號碼是34052419800101001X。我們要看看這個身份證是不是合法的身份證。
首先:我們計算3*7+4*9+0*10+5*5+...+1*2,前17位的乘積和是189
然後:用189除以11得出的結果是商17餘2
最後:通過對應規則就可以知道餘數2對應的數字是x。所以,這是一個合格的身份證號碼。
也可以按照18位來計算,第一位數的權重是07,第二位是09(見下表) [1] 
序號 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01(從右向左數)
權重 07 09 10 05 08 04 02 01 06 03 07 09 10 05 08 04 02 01
號碼03 04 00 05 02 04 01 09 08 00 00 01 00 01 00 00 01 0X
如果第18位是x,那麼就按10計算,
加權求和=21+36+0+25+16+16+2+9+48+0+0+9+0+5+0+0+2+10=199,
其中07*03=21,09*04=36,10*00=0,其餘以此類推,
199除以11等於18,餘數是1,所以這個號碼是正確的。
按18位來計算,只要最後的加權和除以11,餘數只要是1,那麼身份證號碼就是正確的。

身份證校驗碼計算公式

身份證校驗碼Python 計算代碼

digs = input('身份證前17位: ')
if len(digs) != 17 or digs.isdigit() == False:
    print('incorrect input')
else:
    print('身份證第18位: '+ ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'][sum([int(digs[i]) * [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2][i] for i in range(17)]) % 11])

身份證校驗碼Swift4 計算代碼

extension String{
    var isSFZ: Bool {
        get{
            guard self.count == 18 else {
                return false
            }
            var c = 0
            var last = ""
            self.enumerated().forEach { (arg) in
                if arg.offset == 17{
                    last = String(arg.element)
                    return
                }
                c = c +  (Int(String(arg.element)) ?? 0)
                    * (Int(pow(2,17-arg.offset).description)! % 11)
            }
            return ["1","0","X","9","8","7","6","5","4","3","2"][c%11]
                == last.uppercased()
        }
    }
}

身份證校驗碼C++ 計算代碼

#include<bits/stdc++.h>
signed main(void){
    int ans=0,arr[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    std::string ID,map="10X98765432";
    std::cout<<"身份證號:(前十七位)";
    std::cin>>ID;
    if(ID.length()!=17)
        std::cout<<"incorrect input";
    else{
        for(int i=0;i<17;i++)
            ans+=(ID[i]-'0')*arr[i];
        std::cout<<"身份證第18位:"<<map[ans%11];
    }
} 

身份證校驗碼PHP 計算代碼

$card="xxx";//身份證號碼
$map=array(1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2);
$sum = 0;
for($i = 17; $i > 0; $i--){
    $s=pow(2, $i) % 11;
    $sum += $s * $card[17-$i];
}
echo $map[$sum % 11];//這裏顯示最後一位校驗碼

身份證校驗碼Excel算法

請在A1單元格輸入18位身份證號碼.
有的時候需要修改單元格的格式為文本,否則數字會被取近似值.
然後在任意單元格輸入下面的公式就可以得到校驗碼.
看看是否與最後一位相符.就知道身份證號碼是否符合編碼規則了.
=LOOKUP(MOD(MID($A$1,1,1)*MOD(2^17,11)+MID($A$1,2,1)*MOD(2^16,11)+MID($A$1,3,1)*MOD(2^15,11)+MID($A$1,4,1)*MOD(2^14,11)+MID($A$1,5,1)*MOD(2^13,11)+MID($A$1,6,1)*MOD(2^12,11)+MID($A$1,7,1)*MOD(2^11,11)+MID($A$1,8,1)*MOD(2^10,11)+MID($A$1,9,1)*MOD(2^9,11)+MID($A$1,10,1)*MOD(2^8,11)+MID($A$1,11,1)*MOD(2^7,11)+MID($A$1,12,1)*MOD(2^6,11)+MID($A$1,13,1)*MOD(2^5,11)+MID($A$1,14,1)*MOD(2^4,11)+MID($A$1,15,1)*MOD(2^3,11)+MID($A$1,16,1)*MOD(2^2,11)+MID($A$1,17,1)*MOD(2^1,11),11),{0;1;2;3;4;5;6;7;8;9;10},{1;0;"X";9;8;7;6;5;4;3;2})
用上面的公式,只是得到最後一位校驗碼,下面把這個公式進一步簡化改進,可以直接判定身份證號碼是否正確,公式如下:
=IF(LOOKUP(MOD(MID(A1,1,1)*7+MID(A1,2,1)*9+MID(A1,3,1)*10+MID(A1,4,1)*5+MID(A1,5,1)*8+MID(A1,6,1)*4+MID(A1,7,1)*2+MID(A1,8,1)*1+MID(A1,9,1)*6+MID(A1,10,1)*3+MID(A1,11,1)*7+MID(A1,12,1)*9+MID(A1,13,1)*10+MID(A1,14,1)*5+MID(A1,15,1)*8+MID(A1,16,1)*4+MID(A1,17,1)*2,11),{0;1;2;3;4;5;6;7;8;9;10},{"1";"0";"X";"9";"8";"7";"6";"5";"4";"3";"2"})=UPPER(MID(A1,18,1)),"正確","錯誤")
如果返回值是“正確”,那麼身份證號碼通過校驗,如果返回“錯誤”,則身份證號碼肯定錯了!
數組公式計算:=MID("10X98765432",MOD(SUM(MID($A$1,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1) 按ctrl+shift+Enter 計算
除以公式外
可以直接使用的簡化參考公式如下兩種:(以下皆為數組公式,身份證號碼在B2單元格)
一、按規則
文字表達:將2的17次冪+2的16次冪+……+2的1次冪分別對應乘以身份證號碼的1-17位數字,最後求和,再除以11,餘數對應相應的字符
{=LOOKUP(MOD(SUM(2^{17;16;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1}*MID($B2,ROW($1:$17),1)),11),{0,1;1,0;2,"X";3,9;4,8;5,7;6,6;7,5;8,4;9,3;10,2})}
二、按規律取數
文字表達:將身份證號碼1-17位數字,分別乘以給定數字後求和,再除以11,餘數對應相應的字符
{=LOOKUP(MOD(SUM(MID($B2,ROW($1:$17),1)*{7;9;10;5;8;4;2;1;6;3;7;9;10;5;8;4;2}),11),{0,1;1,0;2,"X";3,9;4,8;5,7;6,6;7,5;8,4;9,3;10,2})}
ORALE SQL 計算語句
select decode(mod(substr)'11010119570115701X',1,1)*7+
substr('11010119570115701X',2,1)*9+
substr('11010119570115701X',3,1)*10+
substr('11010119570115701X',4,1)*5+
substr('11010119570115701X',5,1)*8+
substr('11010119570115701X',6,1)*4+
substr('11010119570115701X',7,1)*2+
substr('11010119570115701X',8,1)*1+
substr('11010119570115701X',9,1)*6+
substr('11010119570115701X',10,1)*3+
substr('11010119570115701X',11,1)*7+
substr('11010119570115701X',12,1)*9+
substr('11010119570115701X',13,1)*10+
substr('11010119570115701X',14,1)*5+
substr('11010119570115701X',15,1)*8+
substr('11010119570115701X',16,1)*4+
substr('11010119570115701X',17,1)*2,11,('0','1','1','0','2','X','3','9','4','8','5','7','6','6','7','5','8','4','9','3','2') aa
from dual;

身份證校驗碼Python運用計算模型的計算代碼

第二代居民身份證號碼的校驗碼計算模型 第二代居民身份證號碼的校驗碼計算模型
SFZ = input('身份證前17位: ')
if len(str(SFZ)) != 17:
raise ValueError('incorrect input')
print('身份證第18位:' + str((12-(sum([(int(str(SFZ[NUM]))*(2**(17-NUM)) % 11) for NUM in range(17)]) % 11)) % 11).replace('10','x'))
參考資料