并不是随便的信用卡号都是合法的,它必须通过Luhn算法来验证。

验证过程:

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

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

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

1

卡号是:5432 1234 5678 8881

则奇数(用红色标出)

奇数位和结果:

  1. 1+8+8+4+6+4+2+2+4=35

偶数位乘以2(如果乘积为两位数,则将其减去9)的结果:

  1. 8*2=16-9=7
  2. 8*2=16-9=7
  3. 7*2=14-9=5
  4. 5*2=10-9=1
  5. 3*2=6
  6. 1*22=2
  7. 3*2=6
  8. 5*2=10-9=1
  9. 7+7+5+1+6+2+6+1=35。

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

2

4417 1234 5678 9112
第二个信用卡提供者展示的卡图片上的号码为4417 1234 5678 9112. 
MII是4 (银行和金融业),发行者标识符为441712 (VISA合作伙伴),帐号为345678911,校验位是2. 
我们来应用一下Luhn算法检验4417 1234 5678 9112,跟上一个例子一样。 4      4    1       7      1      2      3      4      5        6        7      8       9       1      1       2
4x2=8  4  1x2=2  7 1x2=2   2 3x2=6 4 5x2=10 6 7x2=14  8  9x2=18  1   1x2=2   2
   8    4     2       7      2       2   6    4  10-9=1    6   14-9=5   8  18-9=9    1     2       2
   8    4     2       7      2      2    6     4      1         6       5        8       9      1      2       2
将最后一行的数字相加得到的结果为69不是10的倍数,结论是4417 1234 5678 9112不是有效的信用卡号码。
如果将校验为由2变成3,卡号变为4417 1234 5678 9113, 这个号码可以通过Luhn算法的检验,因为所有数字相加的结果为70可以10整除。所以表面上来看4417 1234 5678 9113是一个合法的卡号。

注意:

1.       对于偶数个数字的卡号(4417 1234 5678 9112)。将所有第奇数个数字乘以2,如果大于9就减去9。将所有得到的偶数于原先的偶数全部相加其结果必须是10的倍数,否则卡号无效。

2.       如果卡号(456 3510 1008 9033 5387)有奇数个数字,则应将第偶数个数字乘以2,其余步骤相同。

3.       特性:不管号码的长度是奇数还是偶数。都是从倒数第二个数字开始,每隔一位乘以2,如果大于9就减去9。

php实现如下

  1. $num = ‘5432123456788881’;
  2. function is_valid_credit_card($num){
  3. $num = strrev($num); // 这样可以解决卡号是奇数还是偶数的问题
  4. for ($i=1,$j=strlen($num); $i<=$j; $i++) {
  5. if (($i%2)==0) {
  6. $val = $num[$i]*2;
  7. if ($val>9)
  8. $val-=9;
  9. } else {
  10. $val = $num[$i];
  11. }
  12. $sum +=$val;
  13. }
  14. return (($sum%10)==0); // 返回true则号码有效。
  15. }

转载于:https://blog.51cto.com/zphper/1091727

Luhn(卢恩)算法,检测信用卡号的合法性相关推荐

  1. JAVA:实现Luhn卢恩算法(附完整源码)

    JAVA:实现Luhn卢恩算法 package com.thealgorithms.others;import java.util.Arrays; import java.util.Objects;p ...

  2. 课内实验记录|信用卡号的合法性检查

    题目要求 (附加题6.31 信用卡号的合法性,可选做) 信用卡号遵循下面的模式.一个信用卡号必须是13-16位的整数.它的开头必须是: 4,指visa卡 5,指master卡 37,指American ...

  3. java 判断是否信用卡_《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)...

    6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...

  4. 转载自---课内实验记录|信用卡号的合法性检查 2019年05月05日 21:37:45 @退堂鼓一级演员

    题目要求 (附加题6.31 信用卡号的合法性,可选做) 信用卡号遵循下面的模式.一个信用卡号必须是13-16位的整数.它的开头必须是: 4,指visa卡 5,指master卡 37,指American ...

  5. Java黑皮书课后题第6章:**6.31(金融应用:信用卡号的合法性验证)和**6.32 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的

    6.31(金融应用:信用卡号的合法性验证)编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的 6.31题目 题目描述 破题 6.31代码 6.32 代码 运行实例 6 ...

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

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

  7. 金融应用:信用卡号的合法性验证

    信用卡号遵循某种模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Express 卡 6,指Discover卡 1954年 ...

  8. Java语言程序设计数据结构基础篇第11版6.31(金融应用:信用卡号的合法性检验)信用卡号遵循某种模式。一个信用卡号必须是13-16位的整数 (java)

    信用卡号遵循某种模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Express卡 6,指Discover卡 1954年, ...

  9. Java实验3 第十二题:财务应用程序:信用卡号的合法性

    题目描述: 信用卡号遵循下面的模式.一个信用卡号必须是13 到 16 位的整数.它的开头必须是: 4,指 Visa 卡 5,指 Master 卡 37,指 American Express 卡 6,指 ...

最新文章

  1. 别让SSL证书暴露了你的网站服务器IP
  2. IntelliJ IDEA Groovy(转)
  3. LogMiner学习笔记
  4. Shell 自定义函数
  5. [剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]
  6. [转]一个人脸检测器
  7. websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)
  8. 我们为什么会爱上一个人?
  9. python微博爬虫实战_Python爬虫实战演练:爬取微博大V的评论数据
  10. Android-JNI开发系列《九》实战-Bitmap处理实现底片灰度化黑白化暖冷色调等效果
  11. 关于IIS新部署问题“HTTP500.21”错误代码解决办法
  12. PMP-36项目风险管理
  13. 全网通工业无线路由器多网口工业路由器
  14. Linux红帽RedHat 8升级更新Firefox火狐浏览器版本方法
  15. 谷歌浏览器驱动器下载网址
  16. 交易市场中的测不准原理
  17. OnePiece 之 Asp.Net 菜鸟也来做开发(二)
  18. Newtonsoft.Json.JsonConvert.SerializeObject()
  19. 航模电池-LiPo锂聚合物电池(未完待续)
  20. 华为云首席架构师顾炯炯:敢为人先,探索架构创新之路如何走

热门文章

  1. 你真的会vue-router吗?
  2. Android studio 下 JNI 开发实例
  3. SAP Fiori应用的三种部署方式
  4. Jasypt : 整合spring boot加密应用配置文件敏感信息
  5. 《C语言接口与实现:创建可重用软件的技术》一2.6 扩展阅读
  6. maven项目的常用依赖
  7. Maven项目加载JAR包
  8. Spring MVC ajax:post/get 的具体实现
  9. C++primer笔记之关联容器
  10. 从字符串中提取BCD码,转换为UINT数据并返回