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

前言:

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

方法:

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;
			}
		}
	}
};
当然,该检测方法,只能降低用户提供虚假的信息可能性,但不能完全确保用户提供的身份信息不是虚假的。

以下是一个基于 Qt 的身份证号验证代: ```cpp QString idNumber = "110101199003077156"; // 身份证号 QRegExp regExp("^(\\d{17})(\\d|[xX])$"); // 正则表达式匹配规则 if(regExp.exactMatch(idNumber)) { // 如果匹配成功 int factors[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子 char checkCodes[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; // 校验 int sum = 0; // 加权和 for(int i = 0; i < 17; i++) { sum += (idNumber.at(i).digitValue() * factors[i]); // 乘以加权因子并求和 } int remainder = sum % 11; // 模11取余 QChar checkCode = checkCodes[remainder]; // 根据余数获取校验 if(checkCode.toUpper() == idNumber.at(17).toUpper()) { // 校验匹配成功 qDebug() << "身份证号验证通过"; } else { qDebug() << "身份证号校验错误"; } } else { qDebug() << "身份证号格式错误"; } ``` 这个代首先使用正则表达式 `^(\\d{17})(\\d|[xX])$` 来匹配身份证号的格式,如果格式匹配成功,就继续进行验证。验证的过程是根据身份证号的前17位数字乘以对应的加权因子(加权因子从左到右依次为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2),然后将乘积求和并对11取余得到一个余数,再根据这个余数从预先定义的校验数组中获取一个校验,最后将这个校验身份证号的最后一位进行比较,如果相同就认为身份证号验证通过,否则就认为校验错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值