基于Luhn算法的银行卡校验规则

目录
  • 案例:
    • 该校验的过程:
    • 运行结果:
  • 银行卡校验规则(Luhn算法)
    • 卡号位数数量
    • 说明:

案例:

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过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)%10 ==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银行卡校验的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言实现银行卡号Luhn校验

    目录 一.银行卡号码的校验规则 二.生成符合Luhn规则的银行卡号测试数据 思路: 整个代码如下: 一.银行卡号码的校验规则 银行卡号码的校验采用Luhn算法,校验过程大致如下: 1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3…. 2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s. 3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n

  • python银行卡号码校验Luhn模10算法

    目录 一.银行卡号码的校验规则 二.生成符合Luhn规则的银行卡号测试数据 思路: 实现代码: 三.小结 相关资料 有时候在网上办理一些业务时有些需要填写银行卡号码,当胡乱填写时会立即报错,但是并没有发现向后端发送请求,那么这个效果是怎么实现的呢. 对于银行卡号有一个校验算法,叫做Luhn算法. 一.银行卡号码的校验规则 银行卡号码的校验采用Luhn算法,校验过程大致如下: 1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3…. 2. 从右向左遍历,对每一位字符

  • Luhn算法学习及其Ruby版实现代码示例

    关于LUHN算法 LUHN算法,主要用来计算信用卡等证件号码的合法性. 1.从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,将两个位上数字相加保存. 2.把所有数字相加,得到总和. 3.如果信用卡号码是合法的,总和可以被10整除. Luhn 算法或是Luhn 公式,也被称作"模10算法".它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证.该算法是由IBM的科学家Hans Peter Luhn所创造,于195

  • Python3通过Luhn算法快速验证信用卡卡号的方法

    本文实例讲述了Python3通过Luhn算法快速验证信用卡卡号的方法.分享给大家供大家参考.具体分析如下: Python3通过Luhn算法快速验证信用卡卡号,python用起来就是爽,很简单的三行代码就可以验证信用卡卡号是否有效 def luhn_check(num): ''' Number - List of reversed digits ''' digits = [int(x) for x in reversed(str(num))] check_sum = sum(digits[::2]

  • 判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS代码: /** * 银行卡格式校验 * * @param cardNo 银行卡号 * * @return */ + (BOOL) checkCardNo:(NSString*) cardNo{ int oddsum = 0; //奇数求和 int evensum = 0; //偶数求和 int al

  • 基于Luhn算法的银行卡校验规则

    目录 案例: 该校验的过程: 运行结果: 银行卡校验规则(Luhn算法) 卡号位数数量 说明: 案例: 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过. 该校验的过程: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和. 3.将奇数位总和加上偶数位总和,结果应该可以被10整除.

  • PHP实现通过Luhn算法校验信用卡卡号是否有效

    本文实例讲述了PHP实现通过Luhn算法校验信用卡卡号是否有效的方法.分享给大家供大家参考.具体实现方法如下: $numbers = "49927398716 49927398717 1234567812345678 1234567812345670"; foreach (split(' ', $numbers) as $n) echo "$n is ", luhnTest($n) ? 'valid' : 'not valid', '</br>'; fu

  • PHP基于回溯算法解决n皇后问题的方法示例

    本文实例讲述了PHP基于回溯算法解决n皇后问题的方法.分享给大家供大家参考,具体如下: 这里对于n皇后问题就不做太多的介绍,相关的介绍与算法分析可参考前面一篇C++基于回溯法解决八皇后问题. 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法.这种方法适用于解一些组合数相当大的问题. 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向

  • Python实现基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的共识算法,是我们先前介绍过的POW(proof of work)工作量证明算法.目前市值排名前二的比特币和以太坊也是采用的此算法. 虽然POW共识算法取得了巨大的成功,但对它的质疑也从来未曾停止过. 其中最主要的一个原因就是电力消耗.据不完全统计,基于POW的挖矿机制所消耗的电量是非常巨大的,甚至比

  • Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    本文实例讲述了Go语言通过Luhn算法验证信用卡卡号是否有效的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "strings" ) const input = `49927398716 49927398717 1234567812345678 1234567812345670` var t = [...]int{0, 2, 4, 6, 8, 1, 3, 5, 7, 9}

  • jQuery设置Easyui校验规则(推荐)

    废话不多说了,直接给大家贴代码了.具体代码如下所示: //JQuery EasyUI 动态改变表单项的验证规则 $(document).ready(function(){ $('#FILE_QUALITY').combobox({ onChange:function(newValue,oldValue){ if(newValue == 2){ $('#FRONT_FOR_UNIT').validatebox({ required: false }); } else if(newValue ==

  • jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法

    先给大家分享数据校验显示效果 Web前端数据校验组件 Web项目中客户端与服务端的交互离不开Form表单,Form表单中最常用的元素莫过于input标签,input标签首先要用的肯定是text文本框啦! input文本框允许用户任意输入,难免会会有用户输入一些不符合规定的数据,此时,在提交之前对数据校验是很有必要的,如果等到提交到服务端再校验就会大大降低用户体验啦. 前端校验有很多现成的组件,比较好用的有 EasyUI 的 validatebox 插件,提示界面做的相当友好,只是validate

  • Java基于正则实现的日期校验功能示例

    本文实例讲述了Java基于正则实现的日期校验功能.分享给大家供大家参考,具体如下: private void checkDate() throws IOException { // 4种分隔符 String sep = "[-\\./_]"; // 年份 String strPattern = "^(19[4-9]\\d|20\\d{2})" + sep; strPattern += "("; // 月(1,3,5,7,8,10,12) strP

随机推荐