身份证号第18位(效验码)计算方法 用于检测身份证号是否正确

来源:互联网 发布:图形工作站 知乎 编辑:程序博客网 时间:2024/05/18 02:30

前言:

由于在某些时候,可能需要用户输入真实的身份证号,但是用户可能会胡乱输入虚假的身份证号,导致信息的不真实性,所以为了防止用户胡乱输入,可以通过一些小方法来检测身份证号是否输入正确,本文将介绍一种方法——检测效验码,来检测身份证号码的准确性。

方法:

1.将身份证号码前17位数分别乘以下面系数列表对应的数 结果之和并除以11,得到余数。

第1位到第17位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
2.余数只可能有0 、1、 2、 3、 4、 5、 6、 7、 8、 9、 10这11个数字。

其分别对应的身份证号最后一位(效验码 共11种)的列表:1、0、X、9、8、7、6、5、4、3、2。

余数:       0 1 2 3 4 5 6 7 8 9 10效验码列表: 1 0 X 9 8 7 6 5 4 3 2
所以我们以身份证号:310107198607081310 为例来讲解


如上所示身份证号的前17位数分别与系数列表各位相对应,红色数字为身份证效验码,分别相乘得到乘积及总和。

然后将265除以11得到的余数1与效验码列表进行对应,得到效验码是0,所以与提供的身份证号的最后一位相同,即正确的身份证号。

下面附上用C++进行实现该检测程序的代码:(望dalao们不要吐槽代码质量~)

/*检验18位身份证号是否正确用于测试的身份证:正确 身份证:310107198607081310错误 身份证:310107198507081310*/#include <iostream>#include <cctype>bool verifyIdCard(const char* idCard);int main(void){char idCardTemp[19];    //用于存储18位身份证字符串std::cin.getline(idCardTemp,19);if(verifyIdCard(idCardTemp)){std::cout << "ID Card - Good!" << std::endl;    //身份证正确则输出}else{std::cout << "ID Card - Error!" << std::endl;    //身份证错误则输出}return 0;}bool verifyIdCard(const char* idCard){if(strlen(idCard) != 18){    //检测当前身份证是否为18位return false;}else{int coefficient[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};                //身份证前17位对应的系数列表char checkCodeList[] = {'1','0','X','9','8','7','6','5','4','3','2'};    //余数所对应的效验码列表int Sum = 0;int remainder;char checkCodeValue;for(int i=0;i<17;++i){Sum += (idCard[i]-48) * coefficient[i];   //身份证前17位分别与对应的系数相乘之和}remainder = Sum % 11;  //取余数checkCodeValue = checkCodeList[remainder];    //余数只会是[0,10] 计算得到身份证最后一位 效验码if(checkCodeValue == 'X'){  //用于效验码是'X'的一些处理if(checkCodeValue == std::toupper(idCard[17])){return true;}else{return false;}}else{if(checkCodeValue == idCard[17]){return true;}else{return false;}}}};
当然,该检测方法,只能降低用户提供虚假的信息可能性,但不能完全确保用户提供的身份信息不是虚假的。

原创粉丝点击