主頁(yè) > 知識(shí)庫(kù) > Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例

Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例

熱門(mén)標(biāo)簽:徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 高德地圖標(biāo)注客服 百度地圖標(biāo)注自定義圖片 湖州u友防封電銷卡 滴滴外呼系統(tǒng) 常德電銷平臺(tái)外呼系統(tǒng)軟件價(jià)格 白銀外呼paas系統(tǒng) 地圖標(biāo)注賺錢(qián)項(xiàng)目注冊(cè) 電銷機(jī)器人廠商代理

關(guān)于LUHN算法
LUHN算法,主要用來(lái)計(jì)算信用卡等證件號(hào)碼的合法性。
1、從卡號(hào)最后一位數(shù)字開(kāi)始,偶數(shù)位乘以2,如果乘以2的結(jié)果是兩位數(shù),將兩個(gè)位上數(shù)字相加保存。
2、把所有數(shù)字相加,得到總和。
3、如果信用卡號(hào)碼是合法的,總和可以被10整除。
Luhn 算法或是Luhn 公式,也被稱作“模10算法”。它是一種簡(jiǎn)單的校驗(yàn)公式,一般會(huì)被用于身份證號(hào)碼,IMEI號(hào)碼,美國(guó)供應(yīng)商識(shí)別號(hào)碼,或是加拿大的社會(huì)保險(xiǎn)號(hào)碼的驗(yàn)證。該算法是由IBM的科學(xué)家Hans Peter Luhn所創(chuàng)造,于1954年1月6日提出該專利的申請(qǐng),并于1960年8月23日被授予,在美國(guó)的專利號(hào)為2950048。
該算法一直都被大家所公用,并且時(shí)至今日應(yīng)用也很廣泛。它被指定在ISO/IEC7812-1。它的目的不是成為一種加密安全的哈希函數(shù);它的目的是防止意外出現(xiàn)的錯(cuò)誤,而不是惡意攻擊。很多信用卡和眾多的政府身份識(shí)別號(hào)碼都使用該算法從一系列的隨機(jī)數(shù)字中提取有效的數(shù)字。

優(yōu)點(diǎn)和缺點(diǎn)
Luhn 算法會(huì)檢測(cè)到任何單碼的錯(cuò)誤以及幾乎所有的相鄰數(shù)字換位的錯(cuò)誤。但是它不會(huì)檢測(cè)兩個(gè)數(shù)字序列09轉(zhuǎn)90的錯(cuò)誤(反之亦然)。它會(huì)檢測(cè)到十分之七的相同雙位數(shù)錯(cuò)誤(不會(huì)檢測(cè)到22和55的互換,33和66的互換,44和77的互換)。其他更復(fù)雜的檢查數(shù)字算法,如費(fèi)爾赫夫算法,可以檢測(cè)出更多的轉(zhuǎn)錄錯(cuò)誤。模N的Luhn算法是Luhn算法的一個(gè)擴(kuò)展,支持非數(shù)字字符串。因?yàn)樵撍惴ú扇×藦挠蚁蜃蟮姆绞?,而且零位?huì)影響計(jì)算的結(jié)果。只有當(dāng)零位造成了數(shù)位的移動(dòng)或是用零來(lái)填充一串?dāng)?shù)字的開(kāi)頭時(shí)才不會(huì)影響計(jì)算結(jié)果的生成。因此不論在將1234用零填充為0001234之前或是之后,使用Luhn算法得到的結(jié)果都是一樣的。
該算法在美國(guó)專利上是為了給手持或是機(jī)械設(shè)備計(jì)算校驗(yàn)碼。所以它必須盡可能的簡(jiǎn)單。

Ruby版實(shí)現(xiàn)
Luhn算法的基本原理非常簡(jiǎn)單:(eg:49927398716)
第一步:把信用卡號(hào)倒序(61789372994)
第二步:取出倒序后的奇數(shù)位置上的號(hào)碼, 相加等到總和s1(s1=6+7+9+7+9+4=42)
第三步:取出倒序后的偶數(shù)位置上的號(hào)碼,每個(gè)號(hào)碼乘以2. (eg:2,16,6,4,18)
第四步:把第三步得到的大于10的號(hào)碼轉(zhuǎn)化為個(gè)位+十位。(eg:2,7,6,4,9)
第五步:把處理好的偶數(shù)位號(hào)碼相加,得到s2(s2=2+7+6+4+9=28)
第六步:判讀(s1+s2)%10 == 0則有效,否則無(wú)效。(有效)
代碼:

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實(shí)現(xiàn)的各種排序算法
  • Ruby實(shí)現(xiàn)的矩陣連乘算法
  • Ruby實(shí)現(xiàn)的合并排序算法
  • Ruby實(shí)現(xiàn)的最長(zhǎng)公共子序列算法
  • Ruby實(shí)現(xiàn)的最優(yōu)二叉查找樹(shù)算法
  • Ruby實(shí)現(xiàn)的3種快速排序算法
  • ruby實(shí)現(xiàn)的插入排序和冒泡排序算法

標(biāo)簽:公主嶺 荊門(mén) 張家界 普洱 永州 遼寧 三沙 梧州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例》,本文關(guān)鍵詞  Luhn,算法,學(xué)習(xí),及其,Ruby,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Luhn算法學(xué)習(xí)及其Ruby版實(shí)現(xiàn)代碼示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章