• iOS 信用卡/银联卡校验-Luhn算法


    一、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;
        }
    }
     
     
  • 相关阅读:
    事件处理
    模板语法
    计算属性和侦听器
    Class 与 Style绑定
    Springboot使用redis
    修改docker-toolbox/boot2docker容器镜像
    docker容器如何安装vim
    Maven+Docker,发布到Registry
    Maven + Docker
    Jenkins-SVN + Maven + Docker
  • 原文地址:https://www.cnblogs.com/10-19-92/p/6762655.html
Copyright © 2020-2023  润新知