身份证的校验码怎么计算

作者&投稿:沃胜 (若有异议请与网页底部的电邮联系)
身份证号码的最后一位校验码是怎么计算出来的?~

身份证校验码:身份证号码的最后一位

用第1位数乘以2的16次方(即65536)
加上
第2位数乘以2的15次方(即32768)
加上
第3位数乘以2的14次方(即16384)
加上
第4位数乘以2的13次方(即8192)
加上
第5位数乘以2的12次方(即4096)
加上
第6位数乘以2的11次方(即2048)
加上
第7位数乘以2的10次方(即1024)
加上
第8位数乘以2的9次方(即512)
加上
第9位数乘以2的8次方(即256)
加上
第10位数乘以2的7次方(即128)
加上
第11位数乘以2的6次方(即64)
加上
第12位数乘以2的5次方(即32)
加上
第13位数乘以2的4次方(即16)
加上
第14位数乘以2的3次方(即8)
加上
第15位数乘以2的2次方(即4)
加上
第16位数乘以2的1次方(即2)
加上
第17位数乘以2的0次方(即1)
将所得的数乘以9再加上1的和除以11,所得的余数便是18位身份证号的最后一位(余数为10时最后一位是X)。

http://zhangf.bokee.com/4013564.html

我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。

〖GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。

〖GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。

生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。

顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
顺序码的奇数分给男性,偶数分给女性。

校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

为什么除11,在于计算校验码时的函数。请看下边的函数:

公式如下:
∑(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 10
C 1 0 X 9 8 7 6 5 4 3 2
由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。

~(重点看清楚)~ 这个函数展开就是:

a[1]*W[1]+a[2]*W[2]+……+a[18]*W[18]=?
?mod11=“?对11求模”
如:22mod11=2 23mod22也是2 33mod11=3
就是出于后面那个数,只取商不取余数

所以从函数和其展开式来看要对11求模,所一要除11

以下为列子:

*此函数功能:输入的15位或17位或18位的身份证号,返回校验后的最后一位
*
*-----------------------------
FUNCTION sfzjy
Parameters cID
DO CASE
CASE LEN(ALLTRIM(cID)) = 15
cID = STUFF(ALLTRIM(cID),7,0,"19")
CASE LEN(ALLTRIM(cID)) = 18 OR LEN(ALLTRIM(cID)) = 17
cID =LEFT(ALLTRIM(cID),17)
OTHERWISE
RETURN .F.
ENDCASE
If Len(ALLTRIM(cID))#17
Return .f.
Endif
nSum=Val(SubStr(cID,1,1)) * 7 ;
+ Val(SubStr(cID,2,1)) * 9 ;
+ Val(SubStr(cID,3,1)) * 10 ;
+ Val(SubStr(cID,4,1)) * 5 ;
+ Val(SubStr(cID,5,1)) * 8 ;
+ Val(SubStr(cID,6,1)) * 4 ;
+ Val(SubStr(cID,7,1)) * 2 ;
+ Val(SubStr(cID,8,1)) * 1 ;
+ Val(SubStr(cID,9,1)) * 6 ;
+ Val(SubStr(cID,10,1)) * 3 ;
+ Val(SubStr(cID,11,1)) * 7 ;
+ Val(SubStr(cID,12,1)) * 9 ;
+ Val(SubStr(cID,13,1)) * 10 ;
+ Val(SubStr(cID,14,1)) * 5 ;
+ Val(SubStr(cID,15,1)) * 8 ;
+ Val(SubStr(cID,16,1)) * 4 ;
+ Val(SubStr(cID,17,1)) * 2
*计算校验位
check_number=INT((12-nSum % 11)%11)
If check_number=10
check_number='X'
Endif
Return check_number
Endfunc

*-----------------------------
*
*此函数功能:输入的15位或18位身份证号,返回正确的18位的身份证号。
*
*---------------------------

FUNCTION IDCardTF
PARAMETERS cNumber
#DEFINE InvalidSize "身份证号码长度不正确!"
#DEFINE InvalidChar "身份证号码包括非法字符!"
#DEFINE InvalidDate "出生日期无效!"
#DEFINE InvalidReturnValue ".F."
PRIVATE cString
DO CASE
CASE LEN(cNumber) = 15
cString = STUFF(cNumber,7,0,"19")
CASE LEN(cNumber) = 18
cString =LEFT(ALLTRIM(cNumber),17)
OTHERWISE
MESSAGEBOX(InvalidSize,48,"信息提示")
RETURN InvalidReturnValue
ENDCASE
PRIVATE i,n,iRet
STORE 0 TO iRet
FOR i = 1 TO 17
n = SUBSTR(cString,i,1)
IF NOT ISDIGIT(n)
MESSAGEBOX(invalidChar,48,"信息提示")
RETURN invalidReturnValue
ENDIF
n = 2 ^ (18 - i) % 11 * VAL(n)
iRet = iRet + n
ENDFOR
iRet = iRet % 11 + 1
PRIVATE oldDateSet, oldCentury
PRIVATE oldStrictDate, BirthDay
oldDateSet = SET("DATE")
oldCentury = SET("CENTURY")
oldStrictDate = SET("STRICTDATE")
SET DATE ANSI
SET CENTURY ON
SET STRICTDATE TO 0
BirthDay = CTOD(SUBSTR(cString,7,4)+"-"+SUBSTR(cString,11,2)+"-"+SUBSTR(cString,13,2))
SET STRICTDATE TO &oldStrictDate
SET CENTURY &oldCentury
SET DATE &oldDateSet
IF EMPTY(BirthDay)
MESSAGEBOX(InvalidDate,48,"信息提示")
RETURN InvalidReturnValue
ENDIF
RETURN cString+SUBSTR("10x98765432",iRet,1)
ENDFUNC

*-----------------------------
*
*此函数功能:检验输入的15位或18位身份证号码是否为合法
*
*-----------------------------

FUNCTION sfzyn
LPARAMETERS lstr &&参数:lstr 传入的号码
LOCAL lstr,relyn,tsfz
LOCAL m1,m2,m3,m4,m,i,r,c,ai,wi
SET TALK OFF
SET DATE TO ANSI
SET CENT ON
relyn=.F. &&返回值
tsfz=ALLT(lstr)
*分别用m1,m2,m3,m4表示四个条件是否成立
STOR .T. TO m1,m2,m3,m4

*条件1:只能是15或18位
m1=IIF(LEN(tsfz)=15 OR LEN(tsfz)=18,.T.,.F.)
IF LEN(tsfz)=15 && 15位的号码
FOR i=1 TO 15 &&检查每一位是否为数字
m=ASC(SUBS(tsfz,i,1))
IF m<48 OR m>57 &&数字
m2=.F. &&若有一位不是就不再查
EXIT
ENDIF
ENDFOR
m="19" +SUBS(tsfz, 7,2) &&早期的号都是上个世纪的
m=m+"."+SUBS(tsfz, 9,2)
m=m+"."+SUBS(tsfz,11,2)
m=CTOD(m)
IF ISNULL(m) OR isblank(m)
m3=.F. &&生日不正确
ENDIF
ENDIF
IF LEN(tsfz)=18 && 18位的号码
FOR i=1 TO 17
m=ASC(SUBS(tsfz,i,1))
IF m<48 OR m>57
m2=.F.
EXIT
ENDIF
ENDFOR
m=SUBS(tsfz,7,4)
m=m+"."+SUBS(tsfz,11,2)
m=m+"."+SUBS(tsfz,13,2)
m=CTOD(m)
IF ISNULL(m) OR isblank(m)
m3=.F.
ENDIF
r=0 &&计算校验位
FOR i=18 TO 2 STEP -1
ai=VAL(SUBS(tsfz,19-i,1))
wi=MOD(2^(i-1),11)
r=r+ai*wi
NEXT
r=MOD(r,11)
DO CASE
CASE r=0
c="1"
CASE r=1
c="0"
CASE r=2
c="X"
OTHER
c=ALLTRIM(STR(12-r))
ENDCASE
IF UPPE(SUBS(tsfz,18,1))<>c
m4=.F. &&校验位与原码最末位不同
ENDIF
ENDIF
*四个条件全成立,则返回.t.
relyn=IIF(m1 AND m2 AND m3 AND m4,.T.,.F.)
RETU relyn
ENDFUN

*-----------------------------
*
*此函数功能:输入15位或18位的身份证号,返回被校验后的18位的身份证号,若身份证号非法,则返回空
*
*-----------------------------
FUNC sfjy
PARA msfz
ON ERRO RETU ''
DIME T(17)
PRIV msfz,T,sn,i
msfz=ALLT(msfz)
DO CASE
CASE LEN(msfz)=15
msfz=LEFT(msfz,6)+'19'+SUBS(msfz,7)
CASE LEN(msfz)=18
msfz=LEFT(msfz,17)
OTHE
RETU ''
ENDC
FOR i=1 TO 17
IF !ISDI(SUBS(msfz,i,1))
RETU ''
ENDI
ENDF
IF !LEFT(msfz,2)$'11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82'
RETU ''
ENDI
IF EMPT(DATE(VAL(SUBS(msfz,7,4)),VAL(SUBS(msfz,11,2)),VAL(SUBS(msfz,13,2))))
RETU ''
ENDI
sn=0
T(1)=7
T(2)=9
T(3)=10
T(4)=5
T(5)=8
T(6)=4
T(7)=2
T(8)=1
T(9)=6
T(10)=3
T(11)=7
T(12)=9
T(13)=10
T(14)=5
T(15)=8
T(16)=4
T(17)=2
FOR i=1 TO 17
sn=sn+VAL(SUBS(msfz,i,1))*T(i)
ENDF
sn=MOD(sn,11)
ON ERRO
RETU msfz+SUBS('10X98765432',sn+1,1)

我自己做了个EXCEL
表格
来进行
校验码
计算
里面有
算法
你要是需要可以给我你的邮箱,我发过去
你要是只想知道算法,我就简单告诉你
校验码作为第1位(这里按照18、17、16...1
进行号码排列),它生成不是随机的,而是通过前17位的计算得出
具体算法是
前17位分别乘以7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,然后进行ξ和,也就是结果相加;得到的数据模除11(也就是除以11,取其余数),得出0到10共11个
数字
,然后分别对照1,0,X,9,8,7,6,5,4,3,2进行替换,这便是最终的校验码。
举个例子:34052419800101001X
当你不知道最后一位时,也就是
34052419800101001
前17位的
乘积
和(就是分别乘以7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2再求和)是189
,再除以11,
余数
为2
此时,对照1,0,X,9,8,7,6,5,4,3,2的第三位(从0到10
顺序
替换)
得到校验位为X。


身份证的第18位校验码是怎样得来的?
身份证校验码的计算方法 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...

身份证的校验码怎么计算
"*" 表示乘号 i---表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1。a[i]---表示身份证号码第 i 位上的号码 W[i]---表示第 i 位上的权值 W[i] = 2^(i-1) mod 11 计算公式 (1) 令结果为 R 根据下表找出 R 对应的校验码即为要求身份证号码的校验码C。R 0 1...

身份证的校验码是什么意思
15和16位是当地派出所的代码,17位是性别的区分,奇数代表男性,偶数代表女性。18位则是身份证的校验码。尾号的X用来代替数字10。身份证是中华人民共和国居民身份证的简称。身份证分为实卡身份证和电子身份证,是用来证明一个人身份的法定证件。第一代身份证是在1984年4月6日由国务院发布的《中华人民...

身份证校验码是什么意思
第7到14位表示出生年月日,其中第7到10位是年份,11和12位是月份,13和14位是日期。第15到16位是当地派出所的代码,第17位用来区分性别,奇数代表男性,偶数代表女性。最后一位,即第18位,是身份证的校验码。如果尾号是X,则代替数字10。身份证是中华人民共和国公民的身份证明文件。它分为实体卡...

身份证号码的编码规则
三、出生日期 身份证号码的七至十四位数字表示公民的出生日期。其中,七至十位表示年份,十一至十二位表示月份,十三至十四位表示日期。这种编码方式便于对公民的出生信息进行快速准确的识别。四、顺序码和校验码 顺序码是用来区分同一天内出生的人的不同顺序的编码。同一地区同一天出生的人,如果性别不同...

身份证号码上的校检位是如何产生的?
18位号码身份证校验码的计算公式 http:\/\/www.heybrain.com\/notheal\/article\/1138.html (不知道你是否能够看懂下文,上面网址是全文所在)现在的居民身份证由原先的15位号码升级为18位了。从左至右,第1-2位为省级行政区划代码,第3-4为为地级行政区划代码,第5-6位为县级行政区划代码,第7-10位...

身份证的顺序码、校验码是那几个数字求助
顺序码:身份证号码第十五位到十七位。表示在同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。校验码:身份证的最后一位。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾...

身份证编码是什么意思?
2. 出生日期码:显示持证人出生年月日,按照GB\/T7408标准,格式为YYYYMMDD,如19900101表示1990年1月1日。3. 顺序码:在同一地址码区域内,对同年同月同日出生的人进行编号,奇数分配给男性,偶数分配给女性。4. 校验码:位于身份证号码最后一位,通过前17位数字按照ISO7064:1983.MOD11-2校验码系统...

有谁知道身份证最后一位校验码是怎么计算出来的?
份证上最后一位是前面17位的识别码 是通过前面数字计算后除以11再移位得来 因为是除以11,所以0-9共10个数就不够用 就加了一个X 将身份证的18位号往电脑里一输,就会计算前17位(计算方法网上可以查到)计算得出的识别码看是否和输入的一致,如果不一致那这个号码肯定是假的了。识别码一般是作为...

身份证号码的编码规则
第三、第四、第五个分配码。如:005的就是个男生,而且和他同年月日生的男生至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。校验码(身份证最后一位)是根据前面十七位数字码,...

福贡县15887924848: 身份证校验码 - 搜狗百科
裘垄氨甲: Visual FoxPro 版的. *功能:计算身份证的校验码 *返回:18位身份证号码 *入口参数:15位号码或17位号码或18位号码 * 1至6位为区域码 * 15位号码的7至12位、18位号码的7至14位为出生日期 * 15位号码的13位至15位、18位号码的15位至17...

福贡县15887924848: 身份证号码的最后一位校验码是怎么计算出来的 -
裘垄氨甲: 校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码.作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码.Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准.

福贡县15887924848: 身份证后面字母代表什么如x"
裘垄氨甲: 身份证后面字母代表校验码,当校验码计算的余数是2时,身份证号最后一位就是X. 校验码的计算方法: 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.

福贡县15887924848: 身份证号码尾号的校验码是由什么公式计算出来的 -
裘垄氨甲: excel中的数组公式: =REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLACE(A2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1) 按 ctrl + shift + 回车结束公式 意思是以2为底,从17-1每个数...

福贡县15887924848: 身份证号码的效验码怎么算? -
裘垄氨甲: 第十八位是校验码,是随机产生的,按1~10编排的,前9个数用阿拉伯数字显示,10用罗马字母X代替.

福贡县15887924848: 18位身份证的最后一位数字是怎样算出来的 -
裘垄氨甲: 18位身份证号码最后一位校验码的计算方法 公民身份号码是一系列组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.前六位的内容可以通...

福贡县15887924848: 身份证校研码如何算 -
裘垄氨甲: 校验码(第十八位数)作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么 此人的身份证就变成了19位.X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准

福贡县15887924848: 身份证号码最后4位怎么写
裘垄氨甲: 这可不是随便写的.最后4位是顺序码和校验码,身份证号码的详细含义如下:1、第1~6位数为地址码.公民第一次申领居民身份证时的常住户口所在地的行政地区代码,...

福贡县15887924848: 怎么算自己的身份证号码 -
裘垄氨甲: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码.其含义如下: 1. 地址码:表示编码对象常住户口所在县(市、旗、区)...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网