案例:

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位(用红色标出)分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35。

最后35 35=70可以被10整除,认定校验通过。

import java.util.Scanner;
//信用卡号校验算法
public class Luhn {
 public static void main(String[] args) {
  System.out.println("Please input your credit card number:");
  Scanner input = new Scanner(System.in);
  int sumOdd = 0;
  int sumEven = 0;
  String number = input.next();
  int length = number.length();
  int[] wei = new int[length];
  for (int i = 0; i < number.length(); i  ) {
   wei[i] = Integer.parseInt(number.substring(length - i - 1, length
     - i));// 从最末一位开始提取,每一位上的数值
   System.out.println("第"   i   "位数字是:"   wei[i]);
  }
  for (int i = 0; i < length / 2; i  ) {
   sumOdd  = wei[2 * i];
   if ((wei[2 * i   1] * 2) > 9)
    wei[2 * i   1] = wei[2 * i   1] * 2 - 9;
   else
    wei[2 * i   1] *= 2;
   sumEven  = wei[2 * i   1];
  }
  System.out.println("奇数位的和是:"   sumOdd);
  System.out.println("偶数位的和是:"   sumEven);
  if ((sumOdd   sumEven) % 10 == 0)
   System.out.println("Recept.");
  else
   System.out.println("Can not recept.");
 }
}

运行结果:

Please input your credit card number:
5432123456788881
第0位数字是:1
第1位数字是:8
第2位数字是:8
第3位数字是:8
第4位数字是:8
第5位数字是:7
第6位数字是:6
第7位数字是:5
第8位数字是:4
第9位数字是:3
第10位数字是:2
第11位数字是:1
第12位数字是:2
第13位数字是:3
第14位数字是:4
第15位数字是:5
奇数位的和是:35
偶数位的和是:35
Recept.

银行卡校验规则(Luhn算法)

Luhn检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。

算法:将每个奇数加倍和使它变为单个的数字,如果必要的话通过减去9和在每个偶数上加上这些值。如果此卡要有效,那么,结果必须是10的倍数。

比如上图的卡号为3759 8765 4321 001 (15位),从最高位开始所有的奇数位相加,偶数为乘以2相加(偶数乘以2后如果大于10则两位数相加),把这些奇数和偶数都加在一起得到57.

(57 3) ==0 如果此卡满足被10整除,则有效位必定为3。

针对目前提现成功(clear_success)的记录里面,统计卡号的位数和数量关系如下:

卡号位数数量

<13        3038

14           538

15           476

16           10884

17           68

18           4395

19          38070

>20        504

说明:

位数少于14的卡号基本是外资银行,或小银行。

位数少于14的卡号基本是外资银行,或小银行。

***496748***        **     HSBC                               HSBCHKHHHKH  

***430259***        **     HSBC                               HSBCHKHHHKH  

***51878018***     **    Bank of East Asia Limited      BEASHKHHXXX   

位数多于23的卡号大多是卡号包含字母或空格。

62270014 **** 0045 ***      CHINA CONSTRUCTION BANK **                

601382700 **** 9077 **      BANK OF CHINA FOSHAN BRANCH **

如果是国内的主流银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号。

来看看提现成功(clear_success)里面的卡有多少满足Luhn规则

针对16位美元个人用户  准确率:99.84%

正确的卡号数量:3105    不正确的卡号数量 :14

卡号45806509689007** is NOT valid

卡号48620375555016** is NOT valid

卡号54202100231152** is NOT valid

卡号58890201075786** is NOT valid

卡号62106200000456** is NOT valid

卡号62129986037235** is NOT valid

卡号62252017026526** is NOT valid

针对19位美元个人用户   准确率:99.96%

正确的卡号数量:10574       不正确的卡号数量 :13  其中3笔发生退票

卡号60138214000567721** is NOT valid

卡号60138217000662109** is NOT valid

卡号60138220005824282** is NOT valid

卡号60138220006014219** is NOT valid

卡号60220001386050410** is NOT valid

卡号62161132000004484** is NOT valid

卡号62220212082154900** is NOT valid

卡号62220836020035821** is NOT valid

卡号63214140980000000** is NOT valid

以上都是提现成功的卡号,可以看到基本都严格满足Luhn算法。

卡号位数数量

15      1

16      149

17      4

18      64

19      502

20      3

正确的卡号数量:622

不正确的卡号数量:29 1 4 64 3

14%卡填写违法了Luhn算法,也就是这部分卡号都是可以提前通过Luhn校验发现的。

结论是我们可以在填写收款账户的时候,添加一种Luth算法的JS脚本检查用户填写的卡号存在问题。当然即时用户填写的卡号违法了该规则,我们仍然运行用户填写,但给出相应的警示内容(可能填错)。

目前在收银台页面(Checkout.vm)针对信用卡的交易,校验的JS :isValidCardfunction函数就包含了Luth校验规则,必须严格按照该规则的卡才能提交表单。

以上就是基于Luhn算法的银行卡校验规则的详细内容,更多关于Luhn银行卡校验的资料请关注Devmax其它相关文章!

基于Luhn算法的银行卡校验规则的更多相关文章

  1. 用Swift实现MD5算法&amp;引入第三方类库MBProgressHUD

    之前项目里面是用objc写的MD5加密算法,最近在用swift重写以前的项目,遇到了这个问题。顺带解决掉的还有如何引入第三方的类库,例如MBProgressHUD等一些特别好的控件解决的方法其实是用objc和swift混合编程的方法,利用Bridging-header文件。你可以简单的理解为在一个用swift语言开发的工程中,引入objective-c文件是需要做的一个串联文件,好比架设了一个桥,让swift中也可以调用objective-c的类库和frame等等。

  2. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

  3. swift - 函数指针的应用 - 避免重复算法

    =nil;})}privatefuncsearch(selector:(Employee->Bool))->[Employee]{varresults=[Employee]();foreinemployees{if(selector(e)){results.append(e);}}returnresults;}}

  4. 如何用 Swift 实现 A* 寻路算法

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. swift算法实践1

    在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。

  6. swift算法实践2

    字符串hash算法Time33在效率和随机性两方面上俱佳。对于一个Hash函数,评价其优劣的标准应为随机性,即对任意一组标本,进入Hash表每一个单元之概率的平均程度,因为这个概率越平均,数据在表中的分布就越平均,表的空间利用率就越高。Times33的算法很简单,就是不断的乘33,见下面算法原型。

  7. swift算法实践3)-KMP算法字符串匹配

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. swift算法实践4)-trie自动机

    1、trie自动机是识别字符串的确定性有向无环自动机2、图示3、构造代码F包括了状态q所对应的P中的字符串

  9. Swift 算法实战之路一

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. Swift 算法实战之路二

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部