身份证号码的验证及15位升18位的算法
(完整word版)如何用Excel验证身份证号码是否符合规则
EXCEL中如何提取身份证出生日期、性别、检验身份证号码的正确性中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。
18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码.其中3位数字顺序码,是为同一地址码的同年同月同日出生人员编制的顺序号,偶数的为女性,奇数的为男性。
1、提取籍贯地区的行政区划代码(A2为身份证号,下同)15与18位通用:=LEFT(A2,6)如果有一个编码和省份地区的对照表,可以用VLOOKUP函数来提取地区信息。
2、提取出生日期信息15位:=--TEXT(19&MID(A2,7,6),"#—00—00”)18位:=——TEXT(MID(A2,7,8),”#—00-00")15与18位通用:=--TEXT(IF(LEN(A2)=15,19,”")&MID(A2,7,6+IF(LEN(A2)=18,2,0)),”#-00—00”)简化公式:=-—TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),”#-00-00”)(请将输入公式的单元格格式设置为日期格式)3、提取性别信息15位:=IF(MOD(RIGHT(A2),2)=1,”男","女")18位:=IF(MOD(MID(A2),17,1)=1,”男”,"女")15与18位通用:=IF(MOD(MID(A2,IF(LEN(A2)=15,15,17),1),2)=1,"男",”女")简化公式:=IF(MOD(RIGHT(LEFT(A2,17)),2),”男”,"女”)4、检验身份证号码的正确性18位身份证号码的最后一位是检验码,它是根据身份证前17位数字依照规则计算出来的,其值0~9或X.一般情况只要有一位数字输入错误,依照规则计算后就会与第18位数不符。
身份证计算公式
身份证号码15位升18位身份证18位验证18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
G B11643-1999《公民身份号码》主要内容如下:一、范围该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式1、号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码表示编码对象出生的年、月、日,按G B/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码(1)十七位数字本体码加权求和公式S= Sum(Ai * Wi), i =0, ... , 16 ,先对前17位数字的权求和Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi: 7 9 10 5 84 2 1 6 37 9 10 5 8 4 2(2)计算模Y = mo d(S,11) (3)通过模得到对应的校验码Y:0 1 2 3 45 6 7 8 910校验码: 1 0 X9 8 7 6 54 3 2四、举例如下:北京市朝阳区: 11010519491231002X广东省汕头市: 44052418800101001415位升18的方法根据〖中华人民共和国国家标准G B 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
18位身份证号码校验位规则
18位⾝份证号码校验位规则根据〖中华⼈民共和国国家标准 GB 11643-1999〗中有关公民⾝份号码的规定,公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。
排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。
地址码表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码。
⽣⽇期码表⽰编码对象出⽣的年、⽉、⽇,其中年份⽤四位数字表⽰,年、⽉、⽇之间不⽤分隔符。
顺序码表⽰同⼀地址码所标识的区域范围内,对同年、⽉、⽇出⽣的⼈员编定的顺序号。
顺序码的奇数分给男性,偶数分给⼥性。
校验码是根据前⾯⼗七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
下⾯举例说明该计算⽅法。
15位的⾝份证编码⾸先把出⽣年扩展为4位,简单的就是增加⼀个19,但是这对于1900年出⽣的⼈不使⽤(这样的寿星不多了)某男性公民⾝份号码本体码为34052419800101001,⾸先按照公式⑴计算:∑(ai×Wi)(mod 11) (1)公式(1)中:i----表⽰号码字符从右⾄左包括校验码在内的位置序号;ai----表⽰第i位置上的号码字符值;Wi----⽰第i位置上的加权因⼦,其数值依据公式Wi=2(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1根据公式(1)进⾏计算:∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189189 ÷ 11 = 17 + 2/11∑(ai×Wi)(mod 11) = 2然后根据计算的结果,从下⾯的表中查出相应的校验码,其中X表⽰计算结果为10:∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2根据上表,查出计算结果为2的校验码为所以该⼈员的公民⾝份号码应该为 340524************。
身份证校验算法
下面介绍算法:
计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。
例如:假设某女性居民的15位身份证号码是320105820927512,32表示江苏省,01表示南京市,05表示鼓楼区,820927表示1982年9月27日。512表示是该地区同年同月同日的第512人,其中2表示是女性。那么,升级为18位后的号码为32010519820927512C。下面就根据公式来计算C的值。
根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
String[] w = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
for (int i=0; i<17; i++) {
int ai = Integer.parseInt(arrIdCard.substring(i,i+1));
具体实现代码如下(JAVA):
public boolean isIdCard(String arrIdCard) {
int sigma = 0;
身份证正确检验及验证公式
验证公式一=IF(LEN(H20)=18,IF(RIGHT(H20,1)="X",IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18) )*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1)),"正确!","出错啦!"),IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18))*7 LEFT(RIGHT(H20,17))*9LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1))*1,"正确!","出错啦!")),IF(LEN(H20)=15,"老号,请注意!",IF(LEN(H20)=0,"缺号码","位数不对!")))验证公式二=MID("10X98765432",MOD(SUMPRODUCT(MID(H20,ROW(INDIRECT("1:17")),1)*2^(18 -ROW(INDIRECT("1:17")))),11) 1,1)=RIGHT(H20,1)身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。
浅谈如何将身份证号码15位转为18位
浅谈如何将身份证号码15位转为18位笔者日前参与城乡居民保险制度全覆盖审计调查,在审查参保人员是否存在重复参加城乡居保及职工养老险种情况时,发现城乡居保参保人信息中身份证号码均为18位,而职工养老参保人信息中身份证号码长度不唯一,导致无法正确比对数据。
18位身份证号码除了据原有15位基础上,在出生年月部分添加“19”外,号码最后添加一位验证码。
公安局公布的验证码算法内容概述为:将添加“19”后的17位身份证号码对应乘上系数并求和,再将系数和除11后求余数,根据余数对应选择验证码。
笔者据此编写出一套语句,内容如下:一、筛选出15位身份证号码后生成一张新表,将其转为17位1.select 公民身份号码 into 身份证号码 from dbo.个人基本信息 where len(公民身份号码)=152. alter table 身份证号码 add 公民身份号码17位varchar(20)3.update 身份证号码 set 公民身份号码17位=substring(公民身份号码,1,6)+'19'+RIGHT(公民身份号码,7)二、添加系数和、余数及验证码三列Alter table 身份证号码 add系数和 intAlter table 身份证号码 add余数 intAlter table 身份证号码 add验证码 varchar(2)三、求系数和update dbo.身份证号码 set 系数和 =cast(left(公民身份号码17位,1) as int)*7+cast(substring(公民身份号码17位,2,1) as int)*9+cast(substring(公民身份号码17位,3,1) as int)*10+cast(substring(公民身份号码17位,4,1)as int)*5+cast(substring(公民身份号码17位,5,1)as int)*8+cast(substring(公民身份号码17位,6,1)as int)*4+cast(substring(公民身份号码17位,7,1) as int)*2+cast(substring(公民身份号码17位,8,1)as int)*1+cast(substring(公民身份号码17位,9,1)asint)*6+cast(substring(公民身份号码17位,10,1)asint)*3+cast(substring(公民身份号码17位,11,1)asint)*7+cast(substring(公民身份号码17位,12,1) as int)*9+cast(substring(公民身份号码17位,13,1)asint)*10+cast(substring(公民身份号码17位,14,1)as int)*5+cast(substring(公民身份号码17位,15,1)asint)*8+cast(substring(公民身份号码17位,16,1)asint)*4+cast(substring(公民身份号码17位,17,1)as int)*2四、求余数Update 身份证号码 set 余数=系数和%11五、求验证码Update 身份证号码 set 验证码= case when 余数=0 then '1'when 余数=1 then '0'when 余数=2 then 'x'when 余数=3 then '9'when 余数=4 then '8'when 余数=5 then '7'when 余数=6 then '6'when 余数=7 then '5'when 余数=8 then '4'when 余数=9 then '3'when 余数=10 then '2' end六、更新原参保信息表Update a set a. 公民身份号码='b.公民身份号码位'+'b.验证码' from dbo.个人基本信息a,身份证号码 b where a. 公民身份号码=b. 公民身份号码。
公民身份证编码规则
15位的身份证号
dddddd yymmdd xx p
18位的身份证号
dddddd yyyymmdd xx p y
其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同
yyyymmdd yymmdd 为出生年月日
xx顺号类编码
p性别
18位中末尾的y为校验码,在网上可以找到算法
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014
15位的不需要研究了,很简单的:
dddddd yymmdd xx p
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)校验码字符值的计算
Y: 0 1 2 3 4 5 6 7 8 9 10
ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
根据公式(1)进行计算:
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 2/11
∑(ai×Wi)(mod 11) = 2
将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x
身份证正确检验及验证公式
公式二出处
EXCEL提取身份证出生日期、性别、检验身份证号码正确性
中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:
15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。
18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。
假定身份证号码在B1单元格,下面的公式可以综合判断以上三种错误:
验证公式三
=IF(OR(LEN(B1)=18,LEN(B1)=15),IF(LEN(B1)=18,IF(OR(MONTH(DATE(1*(MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,11,2)),DAY(DATE(1*(MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,13,2))),"月日错误",""),IF(LEN(B1)=15,IF(OR(MONTH(DATE(1*(MID(B1,7,2))+1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,9,2)),DAY(DATE(1*(MID(B1,7,2))+1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,11,2))),"月日错误",""))),"身份证位数不对")&IF(AND(LEN(B1)=18,1*MID(B1,7,4)>YEAR(TODAY())-6),"年份错误","")
18位身份证号码验证公式及标准
18位身份证号码验证工具
计算依据及说明
根据《中华人民共和国国家标准》(GB 11643-1999)规定:
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码(1-6位):表示编码对象常住户口所在县(市、旗、区)的行政区划代码
生日码(7-14位):表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
例如:1981年05月11日就用19810511表示。
顺序码(15-17位):为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
其中奇数分给男性,偶数分给女性。
校验码(18位):是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
第十八位数字的计算方法为:
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位数字上出现罗马数字的Ⅹ。
如果余数是10,身份证的最后一位号码就是2。
以上算法来源于网络,具体规范见国家相关标准。
身份证15升18位程序
321324931201081
是否正确 中间变量
正确 正确 正确 正确 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 9 3 1 #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE!
15位和18位校验规则代码设置
15位和18位校验规则代码设置1. 15位和18位校验规则代码的概念和作用唯一识别信息号码是每个公民的标识,它包含了个人的身份信息,并在很多重要场合使用。
在我国,根据公安部颁布的《中华人民共和国居民唯一识别信息法》,唯一识别信息号码一般有15位和18位两种规则代码设置。
这两种唯一识别信息号码的设置规则是为了便于核对、验证和辨认身份信息的真伪。
其中,15位唯一识别信息号码是早期所采用的规则代码,而18位唯一识别信息号码则是根据国家有关法规和政策的调整而产生的。
在本文中,我将会对15位和18位校验规则代码的设置进行全面评估和深入研究,以帮助大家更好地理解这两种规则代码的作用和设计。
2. 15位校验规则代码的设置15位唯一识别信息号码由6位地区码、6位生日和3位顺序码组成。
其中,地区码代表了公民的户口信息所在地,生日是公民出生的年月日,顺序码是在同一地区、同一生日的人中的序号。
通过这种设置,唯一识别信息号码能够唯一地标识一个公民的身份信息,并便于相关部门辨认和核对。
在15位唯一识别信息号码的设置中,采用了一定的校验规则代码,以确保号码的有效性和真实性。
3. 18位校验规则代码的设置18位唯一识别信息号码是根据国家有关法规和政策的调整而产生的,它比15位唯一识别信息号码多出了一位校验码。
通过加入校验码,能够更好地保障唯一识别信息号码的唯一性和真实性,减少唯一识别信息号码被伪造或篡改的可能。
在18位唯一识别信息号码的设置中,校验规则代码更加严格和详细,以适应社会发展和信息安全的需求。
4. 15位和18位校验规则代码的对比在15位和18位唯一识别信息号码的校验规则代码中,都包含了地区码、生日和顺序码,以及校验码(18位唯一识别信息号码)。
但是,由于社会发展和法规的调整,18位唯一识别信息号码的校验规则更加详尽和严格,能够更好地保障身份信息的安全和真实性。
在使用唯一识别信息号码的时候,应当优先选择18位唯一识别信息号码,以确保个人身份信息的真实性和安全性。
身份证号码编排规则及校验位C语言、C#语言、Java语言实现
身份证号码编排规则及校验位C语言、C#语言、Java语言实现///<summary>///校验身份证号,如果正确返回true如果错误返回false///</summary>///<param name="id">/// //身份证目前可分为15位和18位//15位号码组成:省(2)市(2)区/县(2)年(2)月(2)日(2)+序列号(3)[奇数分配给男性偶数分配给女性]//15位升级到18位:出生年都加上19,第二点:第十八位为校验位,也就是说第十八位要从前17位计算而来//如果是15位数字,那么我们就取得17,8位时出生年//如果是18位,则先校验用户输入的身份证是否合法,如果合法者去7-10位为出生年身份证号码中这些数字是怎样排列的,每个数字表示什么意思呢?下面就让我们一起来探索其中的规律吧!新的身份证号码是由18位数字组成的,它们分别表示:(1)前1、2位数字表示:所在省份的代码;(2)第3、4位数字表示:所在城市的代码;(3)第5、6位数字表示:所在区县的代码;(4)第7~14位数字表示:出生年、月、日;(5)第15、16位数字表示:所在地的派出所的代码;(6)第17位数字表示性别:奇数表示男性,偶数表示女性;(7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。
校检码可以是0~9的数字,有时也用x表示。
15位的身份证号dddddd yymmdd xx p18位的身份证号dddddd yyyymmdd xx p y其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同yyyymmdd yymmdd 为出生年月日xx顺号类编码p性别18位中末尾的y为校验码,将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。
将15位身份证补全为18位身份证的算法示例详解
将15位⾝份证补全为18位⾝份证的算法⽰例详解前⾔最近在参与⼀个银⾏项⽬-某银⾏安防系统-反洗钱需求的开发,银⾏项⽬的离不开⾝份证号码,⾝份证号码作为我国公民的唯⼀标识,有这⾮同寻常的意义,由于业务的要求15位的⾝份证号码⽆法命中,所以需要补全为18位,⼀开始⾃⼰想着加个年份的前两位,后⾯再加个X不就⾏了嘛,后来代码写不下去了,上⽹查了资料,才知道⾃⼰想的是多么天真,还是⽐较复杂的,折腾了⼀下午终于有了眉⽬。
⼀、15位⾝份证和18位⾝份证号码结构介绍要进⾏⾝份证号码的验证,⾸先需要了解我国⾝份证号码的编码规则。
我国⾝份证号码多由若⼲位数字或者数字与字母混合组成。
早期⾝份证由15位数字构成,这主要是在1980年以前发放的⾝份证,后来考虑到千年⾍问题,因为15位的⾝份证号码只能为1900年1⽉1⽇到1999年12⽉31⽇出⽣的⼈编号,所以⼜增加了18位⾝份证号码编号规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15A A A A A A Y Y M M D D N N S前六位AAAAAA是⾝份证编码对象的所在地(出⽣地)的编码,该号码可由国家统计局公布的相关标准中得到。
YY表⽰出⽣年的后两位,MM和DD表⽰出⽣⽉和⽇,不⾜两位的⾼位补0,NNS为顺序号,⽆法确定。
S为性别识别码,男性为奇数,⼥性为偶数。
了解了这些,再来写代码就变得容易多了。
⼆、算法实现了解了⾝份证号码的规则后,我们就可以推断出,⾝份证的15位转化位需要两步。
⾸先把15位⾝份证号补全为17位,然后再补全最后⼀位。
但是最后⼀位是数字还是字母X?这⾥⼜出现了问题。
我们知道,⾝份证的最后⼀位为校验位,那么最后⼀位是怎么得到的呢?原来,最后⼀位是由数字1-9组成,超过9的⽐如11就⽤字母X表⽰,否则号码就变成了19位。
了解了这些,经过整理得出⾝份证补全算法实现思想如下:step1、将15位⾝份证号码加⼊出⽣年变为17位 step2、将step1得到的⾝份证17位数分别乘以不同的系数。
自动转换15位身份证号码位18位
自动转换15位身份证号码位18位功能:将15的身份证号升为18位(根据GB 11643-1999)参数:原来的号码(15位)返回:升位后的18位号码用法:=IDCODE(a1) (假设A1放的是原15位号码)关于身份证号码最后一位的校验码的算法如下:我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。
〖GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。
〖GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
顺序码的奇数分给男性,偶数分给女性。
校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
公式如下:∑(a[i]*W[i]) mod 11 ( i = 2, 3, …, 18 ) (1)”*” 表示乘号i——–表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1。
a[i]—–表示身份证号码第 i 位上的号码W[i]—–表示第 i 位上的权值 W[i] = 2^(i-1) mod 11计算公式 (1) 令结果为 R根据下表找出 R 对应的校验码即为要求身份证号码的校验码C。
R 0 1 2 3 4 5 6 7 8 9 10C 1 0 X 9 8 7 6 5 4 3 2由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。
身份证号码15位升18位
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
//加权因子常数
int[] iW=new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//校验码常数
string LastCode="10X98765432";
//新身份证号
15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
C#代码:
private string per15To18(string perIDSrc)
{
int iS = 0;
(2)计算模
Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
身份证号码的规则及验证原理
⾝份证号码的规则及验证原理【⾝份证号码的规则】1、15位⾝份证号码组成:ddddddyymmddxxs共15位,其中:dddddd为6位的地⽅代码,根据这6位可以获得该⾝份证号所在地。
yy为2位的年份代码,是⾝份证持有⼈的出⾝年份。
mm为2位的⽉份代码,是⾝份证持有⼈的出⾝⽉份。
dd为2位的⽇期代码,是⾝份证持有⼈的出⾝⽇。
这6位在⼀起组成了⾝份证持有⼈的出⽣⽇期。
xx为2位的顺序码,这个是随机数。
s为1位的性别代码,奇数代表男性,偶数代表⼥性。
2、18位⾝份证号码组成:ddddddyyyymmddxxsp共18位,其中:其他部分都和15位的相同。
年份代码由原来的2位升级到4位。
最后⼀位为校验位。
校验规则是:(1)⼗七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和Ai:表⽰第i位置上的⾝份证号码数字值Wi:表⽰第i位置上的加权因⼦Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该⾝份证号码不正确。
以下为js版本的校验实例。
<script language="javascript"><!--var powers=new Array("7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2");var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");var sex="male";//校验⾝份证号码的主调⽤function validId(obj){var _id=obj.value;if(_id=="")return;var _valid=false;if(_id.length==15){_valid=validId15(_id);}else if(_id.length==18){_valid=validId18(_id);}if(!_valid){alert("⾝份证号码有误,请检查!");obj.focus();return;}//设置性别var sexSel=document.getElementById("sex");var options=sexSel.options;for(var i=0;i<options.length;i++){if(options[i].value==sex){options[i].selected=true;break;}}}//校验18位的⾝份证号码function validId18(_id){_id=_id+"";var _num=_id.substr(0,17);var _parityBit=_id.substr(17);var _power=0;for(var i=0;i< 17;i++){//校验每⼀位的合法性if(_num.charAt(i)<'0'||_num.charAt(i)>'9'){return false;break;}else{//加权_power+=parseInt(_num.charAt(i))*parseInt(powers[i]);//设置性别if(i==16&&parseInt(_num.charAt(i))%2==0){sex="female";}else{sex="male";}}}//取模var mod=parseInt(_power)%11;if(parityBit[mod]==_parityBit){return true;}return false;}//校验15位的⾝份证号码function validId15(_id){_id=_id+"";for(var i=0;i<_id.length;i++){//校验每⼀位的合法性if(_id.charAt(i)<'0'||_id.charAt(i)>'9'){return false;break;}}var year=_id.substr(6,2);var month=_id.substr(8,2);var day=_id.substr(10,2);var sexBit=_id.substr(14);//校验年份位if(year<'01'||year >'90')return false;//校验⽉份if(month<'01'||month >'12')return false;//校验⽇if(day<'01'||day >'31')return false;//设置性别if(sexBit%2==0){sex="female";}else{sex="male";}return true;}//--></script><input type="text"onblur="validId(this)"maxlength=18 size=18> <select id="sex"><option value="male">男</option><option value="female">⼥</option>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)通过模得到对应的校验码
Y: 0 1: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014
一、范围
该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序 码和一位数字校验码。
2、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份 号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如 下:
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模