Last updated on 2016年11月21日

Luhn算法,也被称作“模10算法”。主要用来计算信用卡、银行卡、会员卡、手机IMEI等号码的合法性。

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

1、数字从右向左开始,偶数位乘以2,如果乘以2的结果是两位数,将两个位上数字相加保存。

2、把所有数字相加,得到总和。

3、如果总和可以被10整除,则号码合法,反之不合法。

英文原文描述:

1.Counting from the check digit, which is the rightmost, and moving left, double the value of every second digit.

2.Sum the digits of the products (e.g., 10: 1 + 0 = 1, 14: 1 + 4 = 5) together with the undoubled digits from the original number.

3.If the total modulo 10 is equal to 0 (if the total ends in zero) then the number is valid according to the Luhn formula; else it is not valid.

优点和缺点

Luhn 算法会检测到任何单码的错误以及几乎所有的相邻数字换位的错误。但是它不会检测两个数字序列09转90的错误(反之亦然)。它会检测到十分之七的相同双位数错误(不会检测到22和55的互换,33和66的互换,44和77的互换)。其他更复杂的检查数字算法,如费尔赫夫算法,可以检测出更多的转录错误。模N的Luhn算法是Luhn算法的一个扩展,支持非数字字符串。因为该算法采取了从右向左的方式,而且零位会影响计算的结果。只有当零位造成了数位的移动或是用零来填充一串数字的开头时才不会影响计算结果的生成。因此不论在将1234用零填充为0001234之前或是之后,使用Luhn算法得到的结果都是一样的。

该算法在美国专利上是为了给手持或是机械设备计算校验码。所以它必须尽可能的简单。

使用

根据定义我们可以反推回去计算最后一位数字:

我们以数字“123456x”为例。求解其校验位 x :

1.使待校验数字串符合Luhn算法;

从右至左,偶数位乘2,大于10则个位与十位数相加,得到数字字符串:

143853x

2.数字字符串相加求和,使之满足“模10算法”即可

1+4+3+8+5+3+x =24 + x

(24 + x)%10 = 0

x=6

程序实现:

1.检测字符串是否符合Luhn算法:

function checkLuhn($num=''){

if(empty($num)) return false;

$num_arr = str_split($num);

krsort($num_arr);

foreach ($num_arr as $key=>&$value){

if(($key+1)%2 == 0){

$value = $value*2;

if($value>=10){

$value = 1 + ($value % 10);

}

}

}

$total = array_sum($num_arr);

if(($total%10) == 0){

// 符合Luhn算法

return true;

}else{

return false;

}

}

//调用函数测试

if(checkLuhn('1234566')){

echo 'ok';

}else{

echo 'no';

}

2.计算校验位的值:

function calcLuhn($num=''){

if(empty($num)) return false;

$num_arr = str_split($num);

krsort($num_arr);

foreach ($num_arr as $key=>&$value){

if(($key+1)%2 == 0){

$value = $value*2;

if($value>=10){

$value = 1 + ($value % 10);

}

}

}

$total = array_sum($num_arr);

$x = 10 - ($total%10);

if($x==10) return 0;

return $x;

}

文章部分资源来自互联网,略有删改;

参考自:

在线luhn算法 php,Luhn算法说明及PHP实现相关推荐

  1. c语言luhn算法生成校验位,银行卡号码校验算法(Luhn算法,又叫模10算法)

    本文最后更新于2019-10-27,已超过 1年没有更新,如果文章内容.图片或者下载资源失效,请留言反馈,我会及时处理,谢谢! 温馨提示:本文共1927个字,读完预计5分钟. 有时候在网上办理一些业务 ...

  2. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  3. 在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智

    在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智 ...

  4. 在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户、物品的协同过滤推荐算法 个性化推荐算法开发 机器学习、人工智能、大数据分布式开发

    在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户.物品的协同过滤推荐算法 个性化推荐算法开发 机器学习.人工智能.大数据分布式开发 Mo ...

  5. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  6. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍

    TLD (Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生在其攻读博士学位期间提出的一种新的单目标长时间( long term tracking )跟踪算法.该 ...

  7. 层次聚类算法 算法_聚类算法简介

    层次聚类算法 算法 Take a look at the image below. It's a collection of bugs and creepy-crawlies of different ...

  8. 机器学习算法--协同过滤算法

    0. 关键词 推荐算法 长尾理论 UserCF ItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代,搜索引擎可以帮助我们查找内容,但只能解决明确的需求.为了让用户从海量信息中高效 ...

  9. 【转】粒子群算法----粒子群算法简介

    一.粒子群算法的历史  粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,CAS中的成员称为主体.比如研究鸟群系统,每个鸟在这个系统 ...

  10. 格雷通路 算法 java,Java算法与数据结构教程

    北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫 算法工程师. 程序 = 数据结构 + 算法 程序是为了解决实际问题而存在的.然而为了解决问题,必定会使用到某些数据结构以及设计 ...

最新文章

  1. linux 内核模块加载错误 disagree about version of symbol module_layout
  2. 运维:windows+python+route的一次相遇
  3. [转帖]Linux中的15个基本‘ls’命令示例
  4. Delphi 105错误
  5. 试验设计与matlab数据分析 下载,试验设计与MATLAB数据分析(附光盘)
  6. handler原子锁_Linux的原子操作与同步机制
  7. [分享]iOS开发-实现view底部控件随着键盘的弹出而上移的效果
  8. Css基本语法及页面引用
  9. Oracle使用小结
  10. eclipse里的Maven插件安装
  11. spring 13-Spring框架基于Annotation的AOP配置
  12. canvas实现点连线动画
  13. html提示框延时消失,javascript实现延时显示提示框特效代码
  14. ramda_使用Ramda.js进行动手功能编程
  15. 做了一个收录 rss opml 文件的仓库,欢迎推荐 opml
  16. PAML中文文档/计算分子进化
  17. krpano php,krpano调试模式的开启
  18. 关于7Z自解压文件拆分,读取条目,复写,合并的功能
  19. js 数字转为千分符格式
  20. 熵值法的Python实现

热门文章

  1. List小心性能损失的方法
  2. 【目标检测】CNN的训练图像与测试图像不一致的多尺度问题
  3. 数据--第47课 - 查找的概念
  4. 实验报告四201521460014
  5. 通用JdbcDao更新,增加动态数据源,支持权重和读写分离
  6. Google搜索技巧终极收集 - 101个Google技巧
  7. css3 flex流动自适应响应式布局样式类
  8. 淘宝 封住baidu的蜘蛛了吗?
  9. .Net下RabbitMQ的使用(4) -- 订阅和发布
  10. Comet OJ 热身赛(K题)principal(括号匹配问题+stack模拟)