美文网首页
18位号码身份证校验码的计算公式

18位号码身份证校验码的计算公式

作者: 零度心脉 | 来源:发表于2018-06-28 11:31 被阅读0次

    居民身份证的号码是按照国家的标准编制的,由18位组成:前六位为行政区划代码,第七至第十四位为出生日期码,第15至17位为顺序码,第17位代表性别(奇数为男,偶数为女),第18位为校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

    (1)十七位数字本体码加权求和公式
    S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
    其中Ai:表示第i位置上的身份证号码数字值
    Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为
    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查下表得到对应的校验码
    Y:1 0 X 9 8 7 6 5 4 3 2<=>{1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 }
    
    bool checkID(const char ID[] )
    {
        int factor[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//加权因子 
        int checktable[] = { 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 };//校验值对应表 
        int i = 0;//i为计数
        int IDNumber[18];
        for ( int i = 0; i < 18; i ++ )//相当于类型转换
            IDNumber[ i ] = ID[ i ] - 48; 
        int checksum = 0; 
        for ( ; i < 17; i ++ )
            checksum += IDNumber[ i ] * factor[ i ];
    
        if (IDNumber[ 17 ] == checktable[ checksum % 11 ] || ( (ID[ 17 ] == 'x' || ID[ 17 ] == 'X') && checktable[ checksum % 11 ] == 10 ))
            return true;
        return false;
    }
    

    相关文章

      网友评论

          本文标题:18位号码身份证校验码的计算公式

          本文链接:https://www.haomeiwen.com/subject/lbkgyftx.html