第二代身份证代码规则/原理剖析及相关代码
作者:佚名 文章来源:本站原创 点击数: 835 更新时间:2008-3-3 15:57:17
-
一、身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
二、编码规则:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。其含义如下:
1. 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2. 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、2(同上)位数字表示,之间不用分隔符。
3. 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4.校验码(R),一位数字,通过前17位数字根据一定计算得出。
三、关于地址码含义的详细解释:
身份证前六位是地区代码,我们用ABCDEF表示。 代码的解释规则如下:
A:国内区域
1 华北三省二市
2 东北三省
vlookup3 华东六省一市
4 华南六省
5 西南四省一市
6 西北五省
室内装修除味7 台湾
8 港澳
B(或者说是AB,就是前2位):省(直辖市,自治区,特别行政区)代码
按照A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。
具体省(直辖市,自治区,特别行政区)代码如下:
11-15 京 津冀 晋 蒙
21-23 辽 吉黑
31-37 沪 苏浙 皖 闽 赣 鲁
41-46 豫 鄂湘 粤 桂 琼
50-54 渝 川贵 云 藏
61-65 陕 甘青 宁 新
81-82 港 澳
CD:城市代码
从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码从省会开始排,比如2101=沈阳 2102=大连…… 只有地级城市有独立的城市代码,县级市没有。
EF:市辖区、郊区、郊县、县级市代码
如果EF=00,指代这个城市,不特定区县;对于非直辖市,如EF=01,
指代市辖区(任意一个区),02开始指代特定的区。
其中:
E=0代表市辖区,
E=1代表郊区,
E=2代表郊县,
E=8代表县级市。
对于直辖市,从01开始就依次排区,没有市区和郊区的代码区分。:
有关更详细的资料见附录。
四、生日期码(YYYYMMDD)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
五、顺序码(XXX)(身份证第十五位到十七位)是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生,而且和他同年月日生的男生至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。
甘露醇的作用与功效六、关于校验码
校验码是通过一系列数学计算得出来的,具体校验的计算方式如下:
1. 对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0, ... , 16
其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
通俗解释:身份证第一位数字X7+第二位X9+第三位X10+第四位X5+第五位X5+第六位X8+第七位X4+第八位X1+第九位X6+第十位X3+十一位X7+十二位X9+十三位X10+十四位X5+十五位X8+十六位X4+十七位X2;计算出总和(用S)表示。
2. 以11对计算结果取模
Y = mod(S, 11)
通俗解释:用S除以11,看最后的余数。如果除尽,为0;余数为1,则计为1;最大余数为10;全部数字为0-10共11个数字。(用Y表示)。
3. 根据模的值得到对应的校验码
对应关系为:
Y值: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
通俗解释:余数为0,则校验码为1;依次类推:余数为1,则校验码对应0;以下:2--X;3--9;4--8;5--7;6--6;7--5;8--4;9-3;10-2。
如果校验码不符合这个规则,则肯定是假号码。
关于18位身份证号码尾数是“X”的一种解释:因为按照上面的规则,校验码有11个,而不是10个,所以不能用0-9表示。所以如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可
以保证公民的身份证符合国家标准。
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
附录一:校验码的计算方法举例:
15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式(1)计算:
hebe 林俊杰∑(ai×Wi) mod 11……………………………………(1)
公式(1)中:
i----表示号码字符从右至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=(2 的 i-1 次幂)(mod 11)计算得出。
I 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
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 (余数为2)
∑(ai×Wi) mod 11 = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10(男性为大写X;女性为小写x):
∑(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************。
附录二:计算机校验身份证号码合法性的程序代码:
CREATE OR REPLACE FUNCTION f_Id_Verify(Pid VARCHAR2) RETURN VARCHAR2 IS
RESULT VARCHAR2(58);
TYPE Char_Tabletype IS TABLE OF VARCHAR2(1) NOT NULL INDEX BY BINARY_INTEGER;
TYPE Num_Tabletype IS TABLE OF NUMBER NOT NULL INDEX BY BINARY_INTEGER;
Tab_a Char_Tabletype;
Tab_w Num_Tabletype;
Tab_i Char_Tabletype;
i NUMBER(2) := 0;
Len NUMBER(2) := Length(Rtrim(Ltrim(Pid)));
Sigma NUMBER(4) := 0;
BEGIN
七年级上册地理期中试卷Tab_i(0) := '1';
Tab_i(1) := '0';
Tab_i(2) := 'X';
Tab_i(3) := '9';
Tab_i(4) := '8';
Tab_i(5) := '7';
Tab_i(6) := '6';
Tab_i(7) := '5';
Tab_i(8) := '4';
Tab_i(9) := '3';
Tab_i(10) := '2';
--Pid := TRIM(Pid);
IF Len = 18 THEN
FOR i IN 1 .. 17 LOOP
Tab_w(i) := MOD(Power(2, ((19 - i) - 1)), 11);
Tab_a(i) := Substr(Pid, i, 1);
Sigma := Sigma + Tab_w(i) * Tab_a(i);
END LOOP;
RESULT := Substr(Pid, 1, 17) || Tab_i(MOD(Sigma, 11));
END IF;
IF RESULT = Pid THEN
RETURN('正确');
ELSE
RETURN('错误,应该是:' || RESULT);
END IF;
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN('错误');
Dbms_Output.Put_Line('发生了异常的错误');
END;
END f_Id_Verify;
/
附录三、中国过去的身份证制度
查阅有关史料,中国最早的身份证制度,应该是1936年民国宁夏省政府所制定的“居民证制度”。
地处西北边隅的宁夏省经济文化落后,但却成为中国身份证制度的发端地.是有其历史原因的。宁夏省建立于1929年1月1日,与甘肃、陕西、绥远及蒙古接壤。1933年,马鸿逵被中央政府任命为宁夏省政府主席。为了加强统治,马鸿逵从1934年开始,在全省清查户口,建立保甲制。1936年5月,中央红军开始西征作战,解放了宁夏省的盐汕、豫旺、同心等地。为了抵御红军,宁夏省制定出各种反共防共之策,发收“居民证”便是其中一种。居民凡15岁以上之男女须一律佩带居民证。宁夏省“居民证”为白布制作,长7厘米,宽3厘米,上面写有姓名、年龄、籍贯、职业、身长、面貌、特征以及手纹箕斗形状等项。“居民证”被规定缝于上衣里面,以便查验。这个“居民证”虽与后来的国民身份征尚有不同,但已具备了身份证的各项要素,当属中国身份证之最早雏形。
三点水者念什么意思不过,宁夏省“居民证”制度的施行并不顺利。主要原因是,布制居民证是缝在衣服上的,由于冼晒和磨损.很快就变得模糊不清。所以,此项制度仅实行了一年多,就变得名存实亡。
1940年夏,马鸿逵又下令在清查户口和居民证的基础上,制发“宁夏省国民身份证”。为此,还制定了《宁夏省国民身份证发给及检验法》。在制发“身份证”的同时,还制发了“客籍人民居留证”及“通行证”,目的是为了“防范汉奸、间谍、奸党与奸宄盗匪起见”。实际上,宁夏省建立身份证制度,主要是为了封锁我陕甘宁边区根据地,同时也为了更进一步强化对宁夏人民的控制。自从发明了国民身份证,马鸿逵抓兵就方便多了。男丁被抽壮丁后,身份证立刻就由部队收存。如有壮丁逃跑,则向出丁户追索。逃兵没有身份证。在宁夏便会寸步难行:要么被抓回来,要么逃往外省:国民身份证制度的
实行,为马鸿逵统治和控制人民、防止逃兵和缉捕逃兵起到了特殊的作用。
《宁夏省国民身份证发给及检查办法》共有15条规定,其主要条款是:年满16岁以上的男子,均须领身份证,规避不领者,16岁以上、40岁以下的罚兵役,40岁以上的罚劳役;行路住店,均须带证,查无证者,即送警察局扣押惩治;16岁以上男子领证时,均须亲自到保,当面填发。对身长要填清几尺几寸几分,面貌要注明五官
是否端正、鼻耳眼是否齐全、面部是否有麻子,瘸子、聋子、瘫子及结巴等症状要在特征栏中准确填出。最令人叫绝的就是填写手指头的箕斗纹了,填证时,要将持证人的十个手指一一看过。“斗”纹划O,“箕”纹划x。马鸿逵曾得意地称:查验手纹箕斗是最科学、最准确的一种方法。其实,这也是没有办法的办法。因为当时宁夏省经济落后,老百姓无钱照相,马鸿逵又舍不得出这笔钱,才绞尽脑汁想出了这个土办法。
宁夏省在发放国民身份证时,对寄居宁夏的外省人发放的是“客籍人民居留证”,对过境的商行旅者则需办理“通行证”,对侨居宁夏的外国人发放的是“外侨身份证”。总之,在马鸿逵统治的宁夏省,必须人人有证,无证则寸步难行。这里,需要说明的一点是,宁夏省的身份证,只发男性,不发女性。因为马鸿逵认为,女性不会出什么乱子。
自1940年夏季开始,历时4个月,宁夏省就完成了身份证发放工作,全省共发身份证25万张。此后,
出行的人们必须随身携证,以备检查。宁夏省在省城(今银川市)和各县城门口、交通要冲,关卡渡口、堡寨桥头均设立了检查站。各检查站前立一木牌,上面写有16个大字:“不领证者,不准入境;不受检查,不能通行。”宁夏省施行国民身份证之法,在当时的中国干了一件很“露脸”的事,于有意无意之中,开了中国身份证之先河。
身份证并非现今才有,古已有之。但它的起源却是官员的识别符号
我国最早的”身份证”是隋唐时期朝廷发给官员们的"鱼符",它用木头或金属精制而成,其形为鱼,分左右两片。鱼符里面刻有官员的姓名,在何衙门任职,官居几品等。鱼符上凿有小孔,以便系佩,同时五品以上的官员还备有盛放鱼符的袋,称为"鱼袋"。鱼符的主要用途是证明官员的身份,以供应召出入宫门验证。宋代,鱼符废,仍佩鱼袋,它比起隋唐时的"鱼符"来,便捷多了。
发布评论