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

 更新时间:2016年05月27日 16:40:44   作者:ningandjin  
Luhn算法主要北用来进行数字验证,尤其是卡号身份证号等,这里我们就来看一下Luhn算法学习及其Ruby版实现代码示例:

关于LUHN算法
LUHN算法,主要用来计算信用卡等证件号码的合法性。
1、从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,将两个位上数字相加保存。
2、把所有数字相加,得到总和。
3、如果信用卡号码是合法的,总和可以被10整除。
Luhn 算法或是Luhn 公式,也被称作“模10算法”。它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans Peter Luhn所创造,于1954年1月6日提出该专利的申请,并于1960年8月23日被授予,在美国的专利号为2950048。
该算法一直都被大家所公用,并且时至今日应用也很广泛。它被指定在ISO/IEC7812-1。它的目的不是成为一种加密安全的哈希函数;它的目的是防止意外出现的错误,而不是恶意攻击。很多信用卡和众多的政府身份识别号码都使用该算法从一系列的随机数字中提取有效的数字。

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

Ruby版实现
Luhn算法的基本原理非常简单:(eg:49927398716)
第一步:把信用卡号倒序(61789372994)
第二步:取出倒序后的奇数位置上的号码, 相加等到总和s1(s1=6+7+9+7+9+4=42)
第三步:取出倒序后的偶数位置上的号码,每个号码乘以2. (eg:2,16,6,4,18)
第四步:把第三步得到的大于10的号码转化为个位+十位。(eg:2,7,6,4,9)
第五步:把处理好的偶数位号码相加,得到s2(s2=2+7+6+4+9=28)
第六步:判读(s1+s2)%10 == 0则有效,否则无效。(有效)
代码:

module LuhnValidator 
 def validate(number) 
  s1 = s2 = 0 
  number.to_s.reverse.chars.each_slice(2) do |odd, even| 
   s1 += odd.to_i 
 
   double = even.to_i * 2 
   double -= 9 if double >= 10 
   s2 += double 
  end 
  (s1 + s2) % 10 == 0 ? 'valid' : 'invalid' 
 end 
end 

相关文章

  • Ruby中case表达式详解

    Ruby中case表达式详解

    本文主要介绍了Ruby中case表达式的两种形式以及分析,有需要的朋友可以参考下
    2014-10-10
  • ruby on rails中Model的关联详解

    ruby on rails中Model的关联详解

    本文给大家详细讲解了ruby on rails中model关联的几种形式,包括一对多,一对一,多对多。并给出了详细的示例,有需要的小伙伴可以参考下
    2017-07-07
  • CentOS7下搭建ruby on rails开发环境

    CentOS7下搭建ruby on rails开发环境

    听说rails是一个比较流行的快速开发框架,对于我这个web不熟悉的人来说,那是极好的!可以快速上手,又能真正了解服务器端的各种,所以rails搞起来。不过一个完整的开发环境搭建过程完成后,真的只能用各种坑来形容~
    2016-02-02
  • Ruby遍历文件夹同时计算文件的md5sum

    Ruby遍历文件夹同时计算文件的md5sum

    这篇文章主要介绍了Ruby遍历文件夹同时计算文件的md5sum,本文直接给出实现代码,需要的朋友可以参考下
    2015-05-05
  • Ruby学习笔记二帮助生成Vim添加代码头的代码

    Ruby学习笔记二帮助生成Vim添加代码头的代码

    这篇文章主要介绍了Ruby帮助生成Vim添加代码头的代码,需要的朋友可以参考下
    2014-07-07
  • Ruby元编程的一些值得注意的地方

    Ruby元编程的一些值得注意的地方

    这篇文章主要介绍了Ruby元编程的一些值得注意的地方,作者自己用实际代码给出了相关示例,需要的朋友可以参考下
    2015-08-08
  • Ruby迭代器的7种技巧分享

    Ruby迭代器的7种技巧分享

    这篇文章主要介绍了Ruby迭代器的7种技巧分享,Ruby中的迭代器非常人性化,本文既是讲解了7个技巧也是讲解了7种迭代器,需要的朋友可以参考下
    2015-01-01
  • Ruby语法笔记

    Ruby语法笔记

    本文给大家记录的是本人学习ruby之后所记录下来的部分语法知识,分享给有需要的小伙伴,希望对大家能够有所帮助。
    2016-02-02
  • ruby 程序的执行顺序

    ruby 程序的执行顺序

    ruby程序的执行是顺序执行的,他是从脚本的第一行执行到最后一行,但是实际执行顺序是
    2008-12-12
  • Ruby编程中的语法使用风格推荐

    Ruby编程中的语法使用风格推荐

    这篇文章主要介绍了Ruby编程中的语法使用风格推荐,好的代码书写风格有助于debug等工作的进行,需要的朋友可以参考下
    2015-08-08

最新评论