第二代居民身份证号码含义详解
本文由 小茗同学 发表于 2017-03-16 浏览(798)
最后修改 2018-06-25 标签:身份证 javascript

含义

第二代身份证号码共18位,其中:

  • 1-6位:表示户口所在县(市、旗、区)的行政区划代码,也就是说如果是同一个县的人,那么身份证前6位肯定都一样;
  • 7-14位:表示出身日期,共8位,遵循yyyyMMdd格式;
  • 15-17位:顺序码,具体是随机分配还是按照出身年月有序分配不清楚,第17位为奇数表示男性,偶数表示女性;
  • 18位:校验码,根据一个固定规则由前17位数字计算得来;

下面着重介绍校验码。

行政区划代码

采用《GB/T2260-2013 中华人民共和国行政区划代码》标准,网上可能有很多是过时的,注意更新。

下载地址:GB-T2260-2013-中华人民共和国行政区划代码.xlsx

前面说了,身份证前6位表示行政区划代码,再具体一点:

  • 1-2 省级行政区代码
  • 3-4 市级行政区代码
  • 5-6 县区行政区代码

我们看一个示例:

440000 广东省
440100 广东省广州市
440200 广东省韶关市
440300 广东省深圳市
440301 广东省深圳市市辖区
440303 广东省深圳市罗湖区
440304 广东省深圳市福田区
440305 广东省深圳市南山区
440306 广东省深圳市宝安区
440307 广东省深圳市龙岗区
440308 广东省深圳市盐田区

校验码

其实只要确定了前面17位,那么第18位就已经确定了,那为什么还要第18位校验码呢?当然是为了校验,至少你随便输入一个18位数字一般不会那么巧刚好合法。

计算规则不太好用语言表达,直接看代码:

/**
 * 获取身份证号第18位校验码
 * @params cid 身份证号码,17或18位均可
 */
function getIdCardLastChar(cid)
{
	if(!cid || cid.length <17) return '';
	var weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 十七位数字权重
	var validates = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; // 校验码
	var sum = 0;
	for(var i=0; i<17; i++) sum += parseInt(cid.charAt(i)) * weights[i];
	return validates[sum % 11];
}

可以看出,由于是对11求余,所以只用0-9这10个阿拉伯数字放不下,只能增加一个X(本意是罗马数字的,而不是英文字母X,但平时书写是一般都用字母X)。

为什么求余是11而不是10

看到这里很多人的第一反应是,为什么是11而不是10,因为如果是10的话就不会多出来一个难看的X了。

试想一下,如果设计成对10求余,那第一步校验位为10的位怎么变化都不会影响最后生成的位,也就是没法校验这些位。校验位为5的位变化2也不会影响最后生成的位。校验位为2的位变化5…….

所以要选择一个公约数尽量少的数来取模才能达到最佳校验效果,而这样的数就是质数,距离10最近的质数肯定是11了。

15位身份证号码

原有15位身份证没有校验位,并且采用的是2位数字来表示出生年份,所以比18位少了3位。