本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。
身份证号码规则:
-
前1、2位数字表示:所在省份的代码;
-
第3、4位数字表示:所在城市的代码;
-
第5、6位数字表示:所在区县的代码;
-
第7-14位数字表示:出生年、月、日;
-
第15、16位数字表示:所在地的派出所的代码;
-
第17位数字表示性别:奇数表示男性,偶数表示女性;
-
第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0-9的数字,有时也用x表示。
法律依据:
《GB11643-1999公民身份号码》规定,公民身份号码的编码对象、号码的结构和表示形式,使每个编码对象获得一个唯一的、不变的法定号码。 -
校验码计算
计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。
校验码.png例如:假设某女性居民的
15位身份证号码是320105820927512,32表示江苏省,01表示南京市,05表示鼓楼区,820927表示1982年9月27日。512表示是该地区,其中2表示是女性。那么,升级为18位后的号码为32010519820927512C。下面就根据公式来计算C
的值。
Y = mod
(S, 11)=MOD(313,11)=5
根据校验值对应表,可知C=7,该人员身份证号码为:
320105198209275127
又如:某男性公民身份证号码的本体码为: 34052419800101001
计算公式令结果为 Y,Y的计算公式为:Y
= mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。
/**
校验身份证号码是否正确 返回BOOL值
@param idCardString 身份证号码
@return 返回BOOL值 YES or NO
*/
- (BOOL)xyh_verifyIDCardString:(NSString *)idCardString {
NSString *regex = @"^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
BOOL isRe = [predicate evaluateWithObject:idCardString];
if (!isRe) {
//身份证号码格式不对
NSLog(@"身份证号码格式不正确");
return NO;
}
//加权因子 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
NSArray *weightingArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
//校验码 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2
NSArray *verificationArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
NSInteger sum = 0;//保存前17位各自乖以加权因子后的总和
for (int i = 0; i < weightingArray.count; i++) {//将前17位数字和加权因子相乘的结果相加
NSString *subStr = [idCardString substringWithRange:NSMakeRange(i, 1)];
sum += [subStr integerValue] * [weightingArray[i] integerValue];
}
NSInteger modNum = sum % 11;//总和除以11取余
NSString *idCardMod = verificationArray[modNum]; //根据余数取出校验码
NSString *idCardLast = [idCardString.uppercaseString substringFromIndex:17]; //获取身份证最后一位
if (modNum == 2) {//等于2时 idCardMod为10 身份证最后一位用X表示10
idCardMod = @"X";
}
if ([idCardLast isEqualToString:idCardMod]) { //身份证号码验证成功
return YES;
} else { //身份证号码验证失败
return NO;
}
}
网友评论