當前位置:律師網大全 - 專利申請 - 什麽是“2121”校驗方法?

什麽是“2121”校驗方法?

2121校驗應該就是利用Luhn算法

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算法得到的結果都是壹樣的。

該算法在美國專利上是為了給手持或是機械設備計算校驗碼。所以它必須盡可能的簡單。

非正式的解釋

該公式會通過校驗碼對壹串數字進行驗證。校驗碼通常會被加到賬戶號碼中,從而拼合成壹個完整的賬戶號碼。拼合後的賬戶號碼要通過以下的測試:

1.從校驗位開始計數(校驗位壹般添加在賬戶的最後面),按從右向左的順序,將偶數都乘以2.

2.將得到的結果相加起來(例如:10=1+0=1,14=1+4=5,也有的說法是若是乘2的結果是兩位數的話,那麽就直接減去9,和之前位數拆開相加的結果是壹樣的),然後再與原數字串的奇數位相加。

3.如果加起來的和模10後為0(也就是相加的結果是以0結尾的,10的倍數),那麽這個數字串根據Luhn算法來說就是有效的,反之就是無效的。

假設壹個字符串為“7992739871”,我們為其加上壹個校驗位,最後組成的數字為7992739871x:

賬戶號碼: 7 9 9

2 7 3

9 8 7 1 x

將偶數位乘以2:7 18 9 4 7 6 9

16 7 2

x

相加後的數字: 7 9 9 4 7 6 9 7 7

2 =67

校驗碼x是通過將相加後的數字乘以9後,在進行模10計算(那麽就是:(67*9)mod10,也有的說法是取比相加的和最小的10的整數倍數字,其實結果都是壹樣的)。通俗地說:

1.計算所有位數的和(67)。

2.將其乘以9(603)。

3.取最後壹位數字(3)。

4.得到的結果就是校驗位。

另外壹種得到校驗位的方法:先計算所有位數的和,用10減去所有位數和模10的結果。(67的個位是7;10-7=3即為校驗位)。通俗地說:

1.計算所有位數的和(67)。

2.取個位數(7)。

3.用10減去個位數(3)。

4.得到的結果就是校驗位。

這樣,我們得到的完整的賬戶號碼是:7992739871x。

下面的每壹個數字 79927398710, 79927398711, 79927398712, 79927398713, 79927398714,

79927398715, 79927398716, 79927398717, 79927398718,

79927398719都給以用如下的方法進行驗證。

1.從最右邊開始計算,將偶數位都乘以2:(1*2)=2,(8*2)=16,(3*2)=6,(2*2)=4,(9*2)=18

2.將每壹位數字加起來:x(校驗位)+(2)+7+(1+6)+9+(6)+7+(4)+9+(1+8)+7=X+67.

3.如果得到的結果是10的倍數,那麽這個賬戶號碼就可能是有效的。需要註意的是3就是唯壹的可以使得和(67+x)是10的整數倍的個位數。

4.因此,以上的所有賬戶除了79927398713 是有效的以外,其他均為無效的賬戶。

校驗位的驗證的代碼實現

以下通過Python來實現的:

def luhn_checksum(card_number):

def digits_of(n):

return [int(d) for d in str(n)]

digits = digits_of(card_number)

odd_digits = digits[-1::-2]

even_digits = digits[-2::-2]

checksum = 0

checksum += sum(odd_digits)

for d in even_digits:

checksum += sum(digits_of(d*2))

return checksum % 10

def is_luhn_valid(card_number):

return luhn_checksum(card_number) == 0

校驗位的計算

上面的算法檢查輸入校驗位的有效性。計算校驗位需要壹個小的適應算法,即:

1.切換奇/偶乘法。

2.如果得到的和(sum)模10等於0的話,那麽校驗碼就是0。

3.否則,校驗碼就等於10減去得到的和模10(10 - (sum mod 10))

def calculate_luhn(partial_card_number):

return 10 - luhn_checksum(int(partial_card_number) * 10)

  • 上一篇:深圳企業註冊日本商標的條件?
  • 下一篇:什麽是水性油漆水性油漆與傳統油漆的區別
  • copyright 2024律師網大全