- 中文名
- 身份证校验码
- 概 念
- 身份证号码的最后一位
- 根 据
- GB 11643-1999
- 最后一位
- 数字校验码
“身份证的最后一位是根据前面十七位数字码,按照ISO 7064:198符旬坑3标准的MOD 11-2校验算法计算得出的检验码。这个作捆赠为尾号的校验码,是由号码编制单位按照统一的公式计算出来的。如果某人的尾号计算结果为0-9,龙拔漏则直接使用该数字作为樱重照尾号;但如道厦去热探旋果尾号计算结果为10,则必须用‘X’来代替,因为若以10作为尾格拘棵号,将会使身份证章篮船号码增加到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位数字和系数相乘的结果相加;
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们计算3*7+4*9+0*10+5*5+...+1*2,前17位的乘积和是189
然后:用189除以11得出的结果是商17余2
也可以按照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单元格)
一、按规则
{=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 计算语句
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运用计算模型的计算代码
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'))