![](http://d.aap5.com/20230209/t01ac564599751749f4.webp)
身份证号码中的校验码是身来自份证号码的最后一位,是根据GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的,公民身份号码是特360百科征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。
- 中文名称 身份证校验码
- 概念 身份证号码的最后一位
- 根据 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、用加出来和除以1来自1,看余数是多少;
4、余数360百科只可能有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。
例如:某男性的身份证号码是34月标攻胞士刑密往紧船二05241980010100那商威真深1X。我们要看看这个身份证是不是药灯还限散斯破八数例合法的身份证。
首先:我们计算3*7+4*9+0*10+5*5+...+1*2,前17位的乘积和是送旧聚鱼犯189
然后:用189除以11得出的结果是商17余2
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
也可以按照18音失区位来计算,第一位数的权重是看相口布此等团07,第二位是09(见下表)
序号 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,所以这个号码巴义乙领什黄前周交张是正确的。
按1场8位来计算,只要最后的加权和除以11,余数只要是1,那么身份证号码就是正确的。
计算公式
E来自xcel算法
请在A1单元格输入18位身份证号码.
有的时候需要修改单元格的格式为文本,否则数字会被取近似值.
然后在任意单元格输入下面的公式就可以得到校验码.
看看是否与360百科最后一位相符.就器由论知道身份证号码是否符同探合编码规则了.
=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)+M定该角费病ID($A$1,4司良耐,1)*MOD(2承规太给殖认组历被^14,11)+MID($A$1,5,1)*M按观者屋剧丝雨OD(2^13,11)+MID($A$1,6,1)*MOD(2^1背水刑2,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+MI频存D(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+MI凯呼D(A1,8,1适飞)*1+MID(A1,9,1)*6+MID(A1,10,1)*3+MID(A1,11,1)*7+M所又ID(A1,12,1)*9+MID(A1,1压味千娘甚造烈困认3,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'))