Luhn(卢恩)算法,检测信用卡号的合法性
并不是随便的信用卡号都是合法的,它必须通过Luhn算法来验证。
验证过程:
1. 从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2. 从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3. 将奇数位总和加上偶数位总和,结果应该可以被10整除。
例1
卡号是:5432 1234 5678 8881
则奇数(用红色标出)
奇数位和结果:
- 1+8+8+4+6+4+2+2+4=35
偶数位乘以2(如果乘积为两位数,则将其减去9)的结果:
- 8*2=16-9=7
- 8*2=16-9=7
- 7*2=14-9=5
- 5*2=10-9=1
- 3*2=6
- 1*22=2
- 3*2=6
- 5*2=10-9=1
- 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实现如下
- $num = ‘5432123456788881’;
- function is_valid_credit_card($num){
- $num = strrev($num); // 这样可以解决卡号是奇数还是偶数的问题
- for ($i=1,$j=strlen($num); $i<=$j; $i++) {
- if (($i%2)==0) {
- $val = $num[$i]*2;
- if ($val>9)
- $val-=9;
- } else {
- $val = $num[$i];
- }
- $sum +=$val;
- }
- return (($sum%10)==0); // 返回true则号码有效。
- }
转载于:https://blog.51cto.com/zphper/1091727
Luhn(卢恩)算法,检测信用卡号的合法性相关推荐
- JAVA:实现Luhn卢恩算法(附完整源码)
JAVA:实现Luhn卢恩算法 package com.thealgorithms.others;import java.util.Arrays; import java.util.Objects;p ...
- 课内实验记录|信用卡号的合法性检查
题目要求 (附加题6.31 信用卡号的合法性,可选做) 信用卡号遵循下面的模式.一个信用卡号必须是13-16位的整数.它的开头必须是: 4,指visa卡 5,指master卡 37,指American ...
- java 判断是否信用卡_《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)...
6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...
- 转载自---课内实验记录|信用卡号的合法性检查 2019年05月05日 21:37:45 @退堂鼓一级演员
题目要求 (附加题6.31 信用卡号的合法性,可选做) 信用卡号遵循下面的模式.一个信用卡号必须是13-16位的整数.它的开头必须是: 4,指visa卡 5,指master卡 37,指American ...
- Java黑皮书课后题第6章:**6.31(金融应用:信用卡号的合法性验证)和**6.32 编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的
6.31(金融应用:信用卡号的合法性验证)编写程序,提示用户输入一个long型整数的信用卡号码,显示这个数字是合法的还是非法的 6.31题目 题目描述 破题 6.31代码 6.32 代码 运行实例 6 ...
- luhn算法 java_java – 使用luhn算法验证信用卡号
我对以下编程任务有疑问. 信用卡号码遵循某些模式.信用卡必须在13到16位之间.它必须从: •4张Visa卡 •5张万事达卡 •美国运通卡37张 1954年,IBM的Hans Luhn提出了一种验证信 ...
- 金融应用:信用卡号的合法性验证
信用卡号遵循某种模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Express 卡 6,指Discover卡 1954年 ...
- Java语言程序设计数据结构基础篇第11版6.31(金融应用:信用卡号的合法性检验)信用卡号遵循某种模式。一个信用卡号必须是13-16位的整数 (java)
信用卡号遵循某种模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Express卡 6,指Discover卡 1954年, ...
- Java实验3 第十二题:财务应用程序:信用卡号的合法性
题目描述: 信用卡号遵循下面的模式.一个信用卡号必须是13 到 16 位的整数.它的开头必须是: 4,指 Visa 卡 5,指 Master 卡 37,指 American Express 卡 6,指 ...
最新文章
- 别让SSL证书暴露了你的网站服务器IP
- IntelliJ IDEA Groovy(转)
- LogMiner学习笔记
- Shell 自定义函数
- [剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]
- [转]一个人脸检测器
- websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)
- 我们为什么会爱上一个人?
- python微博爬虫实战_Python爬虫实战演练:爬取微博大V的评论数据
- Android-JNI开发系列《九》实战-Bitmap处理实现底片灰度化黑白化暖冷色调等效果
- 关于IIS新部署问题“HTTP500.21”错误代码解决办法
- PMP-36项目风险管理
- 全网通工业无线路由器多网口工业路由器
- Linux红帽RedHat 8升级更新Firefox火狐浏览器版本方法
- 谷歌浏览器驱动器下载网址
- 交易市场中的测不准原理
- OnePiece 之 Asp.Net 菜鸟也来做开发(二)
- Newtonsoft.Json.JsonConvert.SerializeObject()
- 航模电池-LiPo锂聚合物电池(未完待续)
- 华为云首席架构师顾炯炯:敢为人先,探索架构创新之路如何走