zoukankan      html  css  js  c++  java
  • 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;
        }
    }
     
     
  • 相关阅读:
    Redis 常用操作命令
    apktool反解apk包
    [转]Windows上搭建Kafka运行环境
    Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题
    Unity3D配合AndroidStudio打包
    NodeJS 最快速搭建一个HttpServer
    Android 获得AndroidManifest文件里自定义的meta标签内容
    Unity3D 解决用Unity导出的Android工程在6.0及以上设备会弹出一串权限对话框的问题
    Unity3D 响应摇杆
    Unity3D 接完GVR SDk后如何插入自己的java代码
  • 原文地址:https://www.cnblogs.com/10-19-92/p/6762655.html
Copyright © 2011-2022 走看看