中华人民共和国公民身份号码
维基百科,自由的百科全书
中华人民共和国公民身份号码是中华人民共和国为中国大陆每个公民从出生之日起编定的唯一的、终身不变的身份代码,在中华人民共和国公民办理涉及政治、经济、社会生活等权益事务方面广泛使用。中华人民共和国公安部负责公民身份号码的编制和组织实施工作。
1999年8月26日中华人民共和国国务院发布《国务院关于实行公民身份号码制度的决定》(国发[1999]15号),这个文件规定自1999年10月1日起在全国建立和实行公民身份号码制度。
目录 |
[编辑] 组成方式
中华人民共和国国家标准GB 11643-1999《公民身份号码》中规定:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
18位数字组合的方式是:
| 1 | 1 | 0 | 1 | 0 | 2 | Y | Y | Y | Y | M | M | D | D | 8 | 8 | 8 | X |
| 地址码 | 出生日期码 | 顺序码 | 校验码 | ||||||||||||||
- 地址码指的是公民常住户口所在县(市、旗、区)的行政区划代码,如110102是北京市西城区。
- 出生日期码表示公民出生的公历年(4位)、月(2位)、日(2位)。
- 顺序码是给同地址码同出生日期码的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。
- 最后一位是校验码,这里采用的是ISO 7064:1983,MOD 11-2校验码系统。校验码为一位数,但如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。
[编辑] 校验码计算方法
- 1. 将身份证号码从右至左标记为
,
即为校验码; - 2. 计算权重系数
;
| 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 |
- 3. 计算

- 4.

计算机脚本
这是一个计算校验码的VBS脚本:
Dim a, w, s ,id msgbox "本程序用于身份证号码的校验与升位",vbokonly+vbinformation,"身份证校验程序" id=inputbox("输入15位身份证号码或18位身份证号码的前17位或","ID","11010519491231002") if vartype(id)<>0 then '检验号码输入合法性 l=0 do until l=1 l=1 p="" if len(id) <>17 then if len(id) <> 15 then l=0 p="输入位数不正确,请输入15位或17位数字。" end if end if for i = 1 to len(id) a=mid(id,i,1) if asc(a)<asc("0") or asc(a)>asc("9") then l=0 p=p & vbCrLf & vbCrLf & "请输入数字,不要包括字符“" & a & "”。" exit for end if next if l=0 then id=inputbox("输入不合法" & vbCrLf & vbCrLf & p,"输入错误",id) end if loop '将15位号码升位到17位号码 if len(id)=15 then id = left(id,6) & "19" & right(id, 9) end if '为17位号码计算校验码 for i = 2 to 18 a = mid(id,19-i,1) w=2^(i-1) mod 11 s=a * w + s next s =(12 - ( s mod 11) )mod 11 if s=10 then s="X" '输出校验后的号码 inputbox "该身份证号码的校验码为“" & s & "”" & vbcrlf & vbcrlf & "经校验的身份证号码如下:","校验完成", id & s end if
这是一个计算校验码的JavaScript脚本:
// 本函数返回身份证号码的检验码 // 接收参数 rid 为身份证号码的左起17位字符串,15位号码请升位后传入 function calcChecksum(rid){ var workArr = rid.split('').reverse(); function W(i){ return Math.pow(2,i-1) % 11; } function S(){ var sum = 0; for (var j=0;j<17;j++){ sum += workArr[j]*W(j+2); } return sum; } return (12-(S() % 11)) % 11; } //测试 alert(calcChecksum('63280119790817003')); //应该返回6
ruby计算校验码的脚本
str="34262219840209049" #身份证前17位 wi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] # Wis s=0 # S in the context for i in 0..str.length-1 n=str[i].to_i-48 s=s+n*wi[i] end a1=(12-s%11)%11 puts a1 # checksum
python计算校验码的脚本
#!/usr/bin/python import re; #定义验证函数 def IC_chk(ic_serial): #权重数组 iW = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; #身份证号码中可能的字符 values = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x'] #使用正则表达式检测 icre = re.compile('^[1-9][0-9]{16}[x0-9]$', re.IGNORECASE); m = icre.match(ic_serial); if m: pass; else: #不是合法的身份证号码,直接退出 return False; S = 0; for i in range(0,17): S += int(ic[i]) * iW[i]; chk_val = (12 - (S % 11)) % 11; return ic_serial[17].lower() == values[chk_val]; #测试验证函数 ic = raw_input("Please input IC serial: "); if IC_chk(ic): print "Correct IC Serial!"; else: print "Wrong IC Serial!";
[编辑] 应用
- 标记在中华人民共和国居民身份证上和所配套的数据库中。(因此,1999年后“居民身份证号”就是“公民身份号码”)
- 标记在居民户口簿上和所配套的数据库中。
- 标记在中华人民共和国机动车驾驶证上和所配套的数据库中。
- 标记在中华人民共和国残疾人证上和所配套的数据库中。
- 作为中国建设银行的网上银行用户码。
[编辑] 重复号码
因为手工升号的原因,第二代身份证存在超过100万例重复的号码,第二代全国联网的身份证办理后,将解决这个问题[1]。但修正需联系重复号码的当事人,无法联系到当事人的将不会被修正[2]。
[编辑] 引用
[编辑] 外部链接
维基文库中相关的原始文献:
,
即为校验码;
;
