由国家质量技术监督局于1999年7月1日实施的GB11643-1999“公民编号”中明确规定了18位ID卡标准. GB11643-1999“公民编号”是该标准的修订版GB11643-1989“社会保障号”,其中指出原来的标准名称“ Social Security Number”已重命名为“ Citizenship Number”,而GB11643-1999“ Citizenship Number”已从更改为它将由GB11643-1989代替. 实施日期. GB11643-1999“公民号”的主要内容如下:
I. 范围
该标准规定了公民编号的编码对象,编号的结构和表达形式,以便每个编码对象获得唯一且未更改的合法编号.
第二,编码对象
公民编号是为具有中华人民共和国国籍的公民编码的.
三,数字的结构与表示
1. 数字结构
公民编号是一个功能组合代码,由一个17位的身体代码和一个校验代码组成. 排列顺序是从左到右: 六位地址码,八位出生日期码,三位顺序码和一位校验码.
2,地址代码
表示编码对象永久居民帐户所在县(市,旗,区)的行政区划代码,应按照GB / T2260的规定执行.
3. 出生日期代码
表示编码对象的出生年份,月份和日期,这是按照GB / T7408的规定实施的. 年,月和日代码之间没有分隔符.
4. 序列码
表示在相同地址码标识的区域内,为同一年,月和日出生的人编程了序列号. 序列号的奇数分配给男性,偶数分配给女性.
5. 验证码
(1)十七位数的身体代码加权总和公式
S =总和(Ai * Wi),i = 0,...,16,首先将前17位数字的权重相加

Ai: 第i个位置的ID编号的数值
Wi: 代表第i个位置的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模块
Y = mod(S,11)
(3)通过模块获取相应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四个示例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014
以下是程序代码:
私有字符串CheckCidInfo(字符串cid)
{
字符串[] aCity =新字符串[] {null,null,null,null,null,null,null,null,null,null,null,“北京”,“天津”,“河北”,“山西” ,“内蒙古”,null,null,null,null,null,“辽宁”,“吉林”,“黑龙江”,null,null,null,null如何能查到号码,null,null,null,“ Shanghai”,“ Jiangsu”, “浙江”,“安威”,“福建”,“江西”,“山东”,null,null,null,“河南”,“湖北”,“湖南”,“广东”,“广西”,“海南”, null,null,null,“重庆”,“四川”,“贵州”,“云南”,“西藏”,null,null,null,null,null,null,“陕西”,“甘肃”,“青海”, “宁夏”,“新疆”,null,null,null,null,null,“台湾”,null,null,null,null,null,null,null,null,null,“ Hong Kong”,“ Macau”,null ,null,null,null,null,null,null,null,“ foreign”};
double iSum = 0;
string info =“”;
System.Text.RegularExpressions.Regex rg =新的System.Text.RegularExpressions.Regex(@“ ^ \ d {17}(\ d | x)$”);
System.Text.RegularExpressions.Match mc = rg.Match(cid);
如果(!mc.Success)
{
返回“”;
}
cid = cid.ToLower();
cid = cid.Replace(“ x”,“ a”);
if(aCity [int.Parse(cid.Substring(0,2))] == null)
{
返回“非法区域”;
}
尝试
{
DateTime.Parse(cid.Substring(6,4)+“-” + cid.Substring(10,2)+“-” + cid.Substring(12,2));
}
抓住
{
返回“非法生日”;
}
对于(int i = 17; i> = 0; i-)
{
iSum + =(System.Math.Pow(2,i))* int.Parse(cid [17-i] .ToString(),System.Globalization.NumberStyles.HexNumber);
}
如果(iSum!= 1)
返回(“非法证书编号”);
return(aCity [int.Parse(cid.Substring(0,2))] +“,” + cid.Substring(6,4)+“-” + cid.Substring(10,2)+“- “ + cid.Substring(12,2)+”,“ +(int.Parse(cid.Substring(16,1))%2 == 1?” Male“: ” Female“));
}
通话测试:
Response.Write(CheckCidInfo(“ 340524198002300019”));
Response.Write(CheckCidInfo(“ 34052419800101001x”));
对于15位身份验证,您可以在验证之前增加到18位,因为它非常忙,因此无法写15-> 18
发布规则:
根据《中华人民共和国国家标准》 GB 11643-1999中关于公民编号的规定,公民编号是一种功能组合代码,由十七位数字的身体代码和一位数字的验证代码组成. 排列顺序是从左到右: 六位地址码,八位出生日期码,三位顺序码和一位校验码.
地址代码表示编码目标的永久居所所在的县(城市,国旗,地区)的行政区划代码. 出生日期代码指示编码对象出生的年,月和日. 年份用四位数字表示,并且在年份,月份和日期之间不需要分隔符. 顺序码表示分配给在同一地址码标识的区域内的同一年,月和日出生的人的顺序号. 序列号的奇数分配给男性,偶数分配给女性. 校验码是根据前面的十七位数字代码和ISO 7064: 1983.MOD 11-2校验码计算出的校验码. 下面以计算方法为例.
首先使用15位ID代码将出生年份扩展为4位数字,简单的是将其添加为19位数字,但这不适用于1900年出生的人(生日星不多)
男性公民编号的身体代码为34052419800101001,首先根据公式计算得出: :
∑(ai×Wi)(mod 11)………………………………(1)
在公式(1)中:
i ----指示数字字符从左到右的位置编号如何能查到号码,包括校验码;
ai ----代表第i个位置的数字字符值;
Wi ----显示第i个位置的加权因子,其值根据公式Wi = 2(n-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
∑(ai×Wi)(mod 11)= 2
根据计算结果,从下表中找到相应的校验码,其中X表示计算结果为10:
∑(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. 因此,该人的公民编号应为34052419800101001X.
将其放入.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-150341-1.html
没人希望战争
苏丹红
非也