一、Kuhn算法
检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。
二、校验过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如:卡号为4514617608810943
1) 奇数位和:3+9+1+8+6+1+4+5 = 37
2) 偶数位和:4*2+0*2+(8*2-9)+0*2+(7*2-9)+(6*2-9)+1*2+4*2 = 33
3) 余数为0则是银行卡:(37+33)/10 = 0
另外:
1、卡号位数少于14的基本是外资银行或小银行
2、卡号位数多余23的大多是卡号包含字母或空格
3、国内主流的银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号
不符合Luhn算法的银行卡:
1、招商银行的运通卡
2、江苏银行有些卡号不符合
注意:
并非所有信用卡银行卡都符合Luhn算法、所以即使用户填写的卡号违反了该规则,我们应该仍然运行用户的填写,但可以给出相应的警示内容,提示用户可能填错了
OC实现
-(BOOL)checkCardNumber:(NSString *)cardNumber{ // 4514617608810943 int sum = 0; NSUInteger cardNumLength = [cardNumber length]; int i = 0; while (i < cardNumLength) { NSString *subStr = [cardNumber substringWithRange:NSMakeRange(cardNumLength - 1 - i, 1)]; int subInt = [subStr intValue]; if (i % 2 != 0) { subInt *= 2; if(subInt > 9) { subInt -= 9; } } sum += subInt; i++; } if((sum % 10) == 0) { return YES; } else { return NO; } }