公民身份号码看起来是一长串数字,最后却有时出现一个X。这个字符没有打破编码规则:它正是规则为“计算结果是10”准备的单字符写法。
要看懂它,先把整串号码分成四段。前面的部分承载特征,最后的部分负责检查录入;所谓“出生顺序”的说法,也要放回各段的用途里判断。

先把18位拆开
GB 11643—1999规定,这是一种由17位本体码和1位校验码连接起来的特征组合码。[1]
| 从左起的位置 | 长度 | 作用 |
|---|---|---|
| 第1—6位 | 6 | 地址码,对应行政区划。 |
| 第7—14位 | 8 | 出生日期码,按年、月、日连续书写。 |
| 第15—17位 | 3 | 顺序码,区分同一地址码、同一出生日期的人。 |
| 第18位 | 1 | 校验码,由前17位按规定的数学关系算出。 |
例如,1966年10月26日写成出生日期码就是19661026。这里不加横线或斜杠,年份占四位,月份和日期各占两位。这样,读码程序不必靠猜测来划分“年、月、日”。
地址码怎样逐层缩小范围
地址码不是电话号码式的任意前缀。前两位共同识别省级行政区划,后面再细分到地级、县级行政区划。在常见的大陆省级代码中,第一位还体现大区分组:
| 第一位 | 常见大区分组 |
|---|---|
| 1 | 华北 |
| 2 | 东北 |
| 3 | 华东 |
| 4 | 中南 |
| 5 | 西南 |
| 6 | 西北 |
因此,山东的37和福建的35都以3开头,而湖北是42。单独拿第二位的7、5、2出来,并不能识别省份,必须与第一位合起来读。[4]
同样,完整的六位地址码对应一个行政区划编码,不能直接当成出生医院的位置或持证人的实时居住地。号码的用途是稳定识别一个人,地址码只是这一编码结构的一部分。
顺序码能说明什么
第15—17位是给同一地址码范围内、同年同月同日出生的人编定的顺序号。规则把奇数分配给男性,偶数分配给女性,于是第17位的奇偶性就能反映这项编码信息。
拿001、002、003、004作一组简单演示:001与003属于奇数一侧,002与004属于偶数一侧。它们能说明编号的奇偶分配,却不能据此断定某人是当天第几个出生,或实际办理登记的第几个人。标准定义的是为同地区、同生日的人编定的顺序号,并未把这个值定义为出生时间排行榜。
所以,“第17位有性别信息”与“后三位是出生排名”是两种不同的判断。前者有明确编码规则,后者超出了这串号码本身能够证明的内容。
校验位怎样算出来
最后一位的工作,是帮助发现本体码在录入或转录时出现的差错。它采用MOD 11-2校验系统;可以把实际计算分成加权求和、求余数、换算校验字符三步。[1]
第一步,从左到右,把前17个数字分别乘以下列权重,再把乘积相加,得到S。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 权重 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
第二步,计算S除以11的余数r。余数只能是0到10中的一个。
第三步,把余数换成校验字符。余数本身不一定就是末位字符,两者的对应关系如下:
| 余数r | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 校验字符 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
数值上,可以把校验值写成“1减S后对11取非负余数”,也就是让S加校验值,再除以11,余数为1。若校验值是10,再把它写成X。
把公开示例完整算一遍
标准附录使用本体码11010519491231002来演示计算。这里采用的是标准公开示例,无需拿任何人的实际证件来试算。
将17位数字逐一乘以相应权重,乘积依次为:
7、9、0、5、0、20、2、9、24、27、7、18、30、5、0、0、4。
相加得到S=167。因为167=11×15+2,所以余数r=2。查对应表,余数2对应校验字符X,完整示例便是11010519491231002X。
也可以直接检查数值关系:X代表10,167+10=177;177除以11余1,符合校验条件。这里的X来自整段计算,没有独立的人口、出生顺序或特殊身份含义。
为什么用X表示10
校验值有0到10共11种可能,而十进制单个数字只有0到9共10种写法。若把末位的10直接写成两个字符,号码就会从18位变成19位,破坏固定长度。
罗马数字X代表十,正好用一个字符容纳第11种校验值。北京市公安局的说明也明确将末位X解释为校验码10的替代写法。[3]
校验码可以帮助发现输入错误,但满足这条算术关系,只能说明号码在这一项检查中一致,不能单独证明证件真实或持有人身份。它解决的是转录检查问题;开头看到的X,就是这套检查规则的一部分。