关闭

身份证号算法

560人阅读 评论(0) 收藏 举报
∑(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  
Wi  7    9    10    5    8    4    2    1    6    3  7  9  10  5  8  4  2  1  
 
根据公式(1)进行计算,然后根据计算的结果,从下面的表中查出相应的校验码,其中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      
 
用Delphi实现身份证15位升18位的算法    
摘自《网易虚拟社区》  (文/耙子)    
  谢谢大虾的帮助。我通过你的帮助,我已经找到了计算机世界的那篇文章,  我还写了delphi的过程,但是不适用于100岁以上的老人。我才发现现在的身份证校验码居然可能是英文字母x,为什么用字母呢?谁知道?    
起码电话上就输不进去新的号码。    
转贴部分计算机世界的文章:    
公民身份号码升位在SYBASE数据库上的实现  四川省绵阳市  胥永康    
根据〖中华人民共和国国家标准  GB  11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。    
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分 隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数 字码,按照ISO  7064:1983.MOD  11-2校验码计算出来的检验码。下面举例说明该计算方法。    
某男性公民身份号码本体码为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。    
以下是我的delphi  函数    
function  TForm1.f(ID:  string):string;    
const    
W:array  [1..18]  of  integer  =  (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);    
A:array  [0..10]  of  char  =  ('1','0','x','9','8','7','6','5','4','3','2');    
var    
i,  j,  S:  integer;    
NewID:  string;    
begin    
if  Length(ID)  <>  15  then    
result:=  ''    
else  begin    
NewID:=  ID;    
Insert('19',  NewID,  7);    
S:=  0;    
try    
for  i:=1  to  17  do  begin    
j:=  StrToInt(NewID[i])  *  W[i];    
S:=  S  +  j;    
end;    
except    
result:=  '';    
exit;    
end;    
S:=  S  mod  11;    
Result:=  NewID  +  A[S];    
end;    
end;   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6090次
    • 积分:118
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类