项目需要找了比较多银行卡的校验方法,发现很多博客的校验方法写的不清不楚乱七八糟,有的连算法的名字都写错了(写成Luhm算法的都有ヽ(#`Д´)ノ),不知道是不是从其他网站直接复制过去的,在这里把自己已经验证成功的方法写下来,避免大家再次踩坑。

Luhn算法定义(来自维基百科):

Luhn算法(Luhn algorithm),也称为“模10”(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码、国际移动设备辨识码(IMEI),美国国家提供商标识号码,或是加拿大社会保险号码。该算法由IBM科学家Hans Peter Luhn创造,专利于1954年1月6日申请,1960年8月23日颁证,美国专利号2950048。

该算法现已属于公有领域并得到了广泛的应用,例如ISO/IEC 7812-1。它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意攻击。

Luhn算法释义(来自维基百科):

Luhn算法会通过校验码对一串数字进行验证,校验码通常会被加到这串数字的末尾处,从而得到一个完整的身份识别码。

我们以数字“7992739871”为例,计算其校验位:

从校验位开始,从右往左,偶数位乘2(例如,7*2=14),然后将两位数字的个位与十位相加(例如,10:1+0=1,14:1+4=5);
把得到的数字加在一起(本例中得到67);
将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。

原始数字 7 9 9 2 7 3 9 8 7 1 x
偶数位乘2 7 18 9 4 7 6 9 16 7 2 x
将数字相加 7 9 9 4 7 6 9 7 7 2 =67

我国的银行卡号码基本上都是符合Luhn算法的,四大行就不用说了,我用比较小的银行测试也可以通过校验,所以只要是常规银行卡我觉得都可以用这个算法去检测合法性。

我用到的算法和维基百科上稍微有些不同(或者说是维基百科上写的不太好),其中,原始数字最后一位应该是表格中的X,所谓的将偶数位乘以2,是去掉校验数X之后开始算的。

维基百科里面的:偶数位乘2,然后将两位数字的个位与十位相加这一条,代码上可以写成:如果偶数位数字乘以2如果大于9则将结果减去9。

最后一步,改成,将得到的数字加在一起,再与校验数字相加,得到的最后结果如果对10取模等于0,则视为合法。

逻辑变形为:

1、取银行卡号码最后一位为校验数;

2、除校验位外,从右往左,偶数乘以2,如果得到的数字大于9则减去9;

3、将经过步骤2处理过的所有数字相加(包括奇数位、偶数位、校验位);

4、对10取模,如果结果为0则为合法。

写成代码如下:

/**
* @brief    Luhn算法验证银行卡号
* @para     cardNum:银行卡号
* @author   Andy
* @date     2019-03-19
*/
bool checkBankCard(QString cardNum){int xCheck = cardNum.right(1).toInt();cardNum = cardNum.left(cardNum.size() - 1);int size = cardNum.length();if (size > 19) return false;int sum = 0;for(int n = size; n > 0; n--) {int value = cardNum.at(n - 1).digitValue();if (value == -1) return false;if ((size - n) % 2 == 0) {value *= 2;if(value > 9) value -= 9;}sum += value;}return (sum + xCheck) % 10 == 0;
}

QT C++ Luhn算法验证银行卡号合法性相关推荐

  1. Java使用luhn校验算法实现银行卡号合法性校验获取银行卡号所属银行

    Luhn校验算法或是Luhn 公式,也被称作"模10算法".它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码, 或是加拿大的社会保险号码的验证.该算 ...

  2. c语言验证信用卡 卡号介于13到16位,使用luhn算法验证信用卡号码

    信用卡号码符合特定模式.信用卡必须有13到16位数字.它必须先从: •4 Visa卡 •5主卡 •37美国运通卡 在1954年,IBM的汉斯·卢恩提出的算法验证信用卡号.该算法对于确定卡号是否正确输入 ...

  3. Luhn算法验证信用卡的合法性

    算法描述为: 1.从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是是两位数,将结果减去9(可以理解为各位数相加) 2.把把有数字相加得到总和 3.看是否能被10整除,如果能,说明是合法的 ph ...

  4. luhn算法 java_java – 使用luhn算法验证信用卡号

    我对以下编程任务有疑问. 信用卡号码遵循某些模式.信用卡必须在13到16位之间.它必须从: •4张Visa卡 •5张万事达卡 •美国运通卡37张 1954年,IBM的Hans Luhn提出了一种验证信 ...

  5. 银行卡号合法性验证小结

    关于银行卡号合法性的验证,网上主流的验证算法是luhn算法,代码如下: /*** 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位* @author mengrang* @since 201 ...

  6. js luhn算法_判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...

  7. 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...

  8. luhn算法java_Java信用卡验证– Java中的Luhn算法

    luhn算法java Recently I came to know that Credit Card numbers are not random and passes Luhn Algorithm ...

  9. 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆

    import java.util.Scanner;/*** 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,* 因为并不是一个随便的信用卡号码都是合法的,它必须通过Luh ...

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

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

最新文章

  1. 百万奖金悬赏AI垃圾分类,就问你来不来?
  2. 干货整理!10个Python图像处理工具,入门必看,提效大法
  3. java rxtx version_java – 不匹配的RXTX版本
  4. c语言控制与实现 pdf,c语言的控制输出格式.pdf
  5. android linearllayout 隐藏 动画,AnimatedLinearLayout:带删除动画的LinearLayout
  6. 遗传算法可用什么算法代替_获取可用密码算法的列表
  7. 红米Note 8 Pro新配色公布:轻盈一握宛若浮华在手
  8. test函数java,js中test()函数在正则中使用
  9. 1、eclipse 使用git提交项目至github进行项目托管
  10. PyTorch学习基础知识二
  11. 三次Hermite插值
  12. “青山依旧在,几度夕阳红” 2021.12.7日晚
  13. Unity实现推箱子
  14. 回复犹豫的实习生——走好脚下,心怀未来
  15. Android平板app开发布局文件,Android平板开发相关
  16. 力扣-718最长重复子数组(dp)
  17. 我的个人博客是如何申请百度联盟通过的?
  18. 北上广深到底谁大谁小?
  19. java script 月日年转年月日_如何将这种格式的日期(2010年7月13日星期二00:00:00 CEST)转换为Java日期(字符串来自alfresco属性)...
  20. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...

热门文章

  1. Java里用Frame框架写流星雨
  2. 老男孩之《生日快乐》
  3. html css使用特殊自定义字体避免侵权
  4. 基于GIS的三维智慧警务系统
  5. 拯救期末!大四留学生发“论文机器人”,替你读文献给方向调格式,已被ACL2019收录
  6. 使用python embedded distribution
  7. 2021-12-23 714. 买卖股票的时机含手续费(动态规划)
  8. [BBC纪录片][2009][自然界最惊异的事件][Nature's.Most.Amazing.Events][中英字幕][蓝光720P高清][全6集][17.77GB]
  9. 如何破“万事开头难”?试试这三招
  10. 苹果快捷键怎么调出来_iPad常用快捷键