身份证号算法

    技术2022-05-11  24

    ∑(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)