身份证验证 - iOS
2019-11-11 本文已影响0人
survivorsfyh
日常开发中难免会遇到一些对信息校验相关的需求,如下是针对身份证信息进行相关校验的方法;
一、身份证 15 位
1.编码规则:dddddd yymmdd xx p
dddddd:即六位地区的编码;
yymmdd:即出生的年(后两位年)月日,例如 920524;
xx:即顺序编码,系统生成而无法确定的;
p:即性别编码,其中奇数为男,偶数为女。
二、身份证 18 位
1.编码规则:dddddd yyyymmdd xxx y
dddddd:即六位地区的编码;
yyyymmdd:即出生年月日,例如 19920524;
xxx:即顺序编码,系统生成而无法确定的,其奇数为男,偶数为女;
y:即校验码,该位数值可以通过前面 17 位数值计算而来。
三、校验码 y 计算方式
前 17 位号码加权因子为 wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
验证码 y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
验证码计算公式:Y_P = mod( ∑(Ai×Wi), 11 )
其中,i 为身份证号码 1...17 位
Y_P 为验证码 Y 所在校验码数组中的位置
如果验证码恰巧为 10,为保证其身份证 18 位,即末位将用 x 来代替
/** 校验身份证号码是否正确 返回BOOL值*/
+ (BOOL)YHVerifyIDCardString:(NSString *)idCardString;
/**
校验身份证号码是否正确 返回 BOOL值
十八位: ^[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]$
十五位: ^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$
总结:
^[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]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$
@param idCardString 身份证号码
@return 返回 BOOL值 YES or NO
*/
+ (BOOL)YHVerifyIDCardString:(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]$";
NSString *regex = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
BOOL isRe = [predicate evaluateWithObject:idCardString];
if (!isRe) {
//身份证号码格式不对
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;
}
}
以上便是此次分享的全部内容,希望能对大家有所帮助!