种豆资源网

当前位置:首页 > 百科 > 百科综合 / 正文

身份证校验码

(2018-03-02 01:25:30) 百科综合
身份证校验码

身份证校验码

身份证号码中的校验码是身份证号码的最后一位,是根据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,就会在身份证的第18位数字上出现罗马数字的X。
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们计算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,所以这个号码是正确的。
按18位来计算,只要最后的加权和除以11,余数只要是1,那幺身份证号码就是正确的。

计算公式

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()        }    }}

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;

计算模型

第二代居民身份证号码的校验码计算模型第二代居民身份证号码的校验码计算模型

标 签

搜索
随机推荐

Powered By 种豆资源网||