當前位置:首頁 » 操作系統 » 0校驗演算法

0校驗演算法

發布時間: 2023-03-28 10:08:20

『壹』 什麼是「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)

『貳』 校驗演算法的缺點

校驗演算法不是其他人工作的簡單推廣,它摒棄了把已有的方法 集中到一起的想法,而是探素使用簡單的代數概念來解決問題 的方法。盡管思想是簡單的,但是非常有創造性。然而,這個算 法目前可能不會有太多的實際應用。這是因為演算法的運行時間 是0((log n)}),與Miller和Rabin設計的概率測試的0(log rz) 運行時間相比是相形見咄的。研究者們注意到如果某個猜想被 證明,演算法可以在0((logn)')時間內運行,這樣的改善將促進 實際的應用。研究者們還證明如果Sophie Germain素數具有期 望的分布,那麼在時間估計中的指數12可以減少到5。當然如 果發現素數的分布並非如此,那將會有很大區別。 校檢演算法最重要的意義是作為一個理論結果,為這一領域 的研究奠定了基礎。之後在技術上將會進行改進與完善,使之 更為實用。

『叄』 校驗碼的演算法舉例

按照中華人民共和國國家標准GB11643-1999規定中華人民共和國公民身份號碼校驗碼的計算方法即為ISO 7064:1983.MOD 11-2校驗碼計演算法。
假設某一17位數字是 17位數字 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 加權因子 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 368
計算17位數字各位數字與對應的加權因子的乘積的和S:1×7+2×9+3×10+4×5+5×8+6×4+7×2+8×1+9×6+0×3+1×7+2×9+3×10+4×5+5×8+6×4+7×2=368; 計算S÷11的余數T:368 mod 11=5; 計算(12-T)÷11的余數R,如果R=10,校驗碼為字母「X」;如果R≠10,校驗碼為數字「R」:(12-5)mod 11=7。 該17位數字的校驗碼就是7,聚合在一為123456789012345677。
加權因子公式為Wi=2^(n-1)(mod 11),n為數字序列從右到左的從1開始的順序數。

ai 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 ?Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1 全國組織機構代碼由八位數字(或大寫拉丁字母)本體代碼和一位數字(或大寫拉丁字母)校驗碼組成。校驗碼按下列公式計算: 8 C9=11-MOD(∑Ci×Wi,11) i=1 MOD-表示求余函數;i-表示代碼字元從左至右位置序號;
Ci-表示第i位置上的代碼字元的值,採用下列「代碼字元集」所列字元;
C9-表示校驗碼;
Wi-表示第i位置上的加權因子,其數值如下表:
加權因子 i 1 2 3 4 5 6 7 8 Wi 3 7 9 10 5 8 4 2 當MOD函數值為1(即C9=10)時,校驗碼應用大寫拉丁字母「X」表示;當MOD函數值為0(即C9=11)時,校驗碼仍用「0」表示;當C9的值為1至9時,校驗碼直接用C9的值表示。

『肆』 傳輸數據為0,怎麼計算CRC校驗碼

接收方:使用相同的舉殲槐生成碼進行校驗:接收到的欄位/生成碼(二進制除法) 如果能夠除盡,則正確, 即得到正友的余數是改鄭1001的話是正確的 進行異或運算時除數和被除數最高位對齊,按位異或。 110110000- 110010000=000100000- 110010= 010010- 11001= 01011 不等於 1001 所以有錯誤

『伍』 CRC校驗全解

這幾天一直在看CRC校驗演算法。CRC版本眾多,網站上實現演算法一大坨,可一開始根本搞不清楚那個是哪個。連續上網路,嗶哩嗶哩,知乎看了很多解讀CRC演算法的,終於有了一些眉目,打算寫下來,方便日後參考。

CRC演算法核心其實只有一種,即二進制除法的實現橘清,版本眾多的原因主要有以下幾個原因:

CRC欄位的長度

多項式公式

初始值

輸出是否水平翻轉

輸入是否水平翻轉

結果異或值

我絕大多數的文章都只談到了CRC欄位的長度和多項式公式,沒有涉及剩餘的三項在crc演算法中的應用。

CRC欄位的長度 ,欄位越長,對於crc演算法的校驗能力越強。如果我們用出錯的概率來評宏旦估校驗能力的話。N長度的欄位,他的校驗能力為1/2**N。此處的運算符號採用Python語言中的含義。

一般而言,我們取的長度主要有8位,16位和32位。當然也有一些比較奇特的,4位,5位和6位,還有7位。

多項式公式 是我們二進制多項蔽伍擾式演算法中的除數。不同的演算法往往取的多項式是不一樣的。

初始值 ,是指CRC欄位的初始值。常常是從0和全是1中選擇。

輸入反轉。 具體的操作方法實施將輸入的數據按照位元組為單位進行水平反轉。比如01000001,翻轉結果是10000010。

輸出翻轉 。輸出翻轉的操作與輸入翻轉操作是一樣的。只是輸出翻轉是將整個CRC欄位進行水平翻轉。

結果異或值 ,是用來和 通過上述的演算法算出來的結果 進行異或的一個數據值。如果這個值是0的話,那麼就相當於沒有進行異或。

為什麼需要這么多看起來亂七八糟的種類呢。這些演算法分別針對不同的數據的檢驗。針對不同的數據的特性,比如說某些數據,一開始就會有大量的零,如果不採用輸入翻轉或者初始值的話,那麼這些0就對於校驗結果沒有任何影響。這就如我們想要的結果有出入了,我們希望校驗結果和數據是一一對應的,並且是唯一的。如果不唯一那麼,校驗結果也就失去了意義。因此這么多演算法的出現,主要原因就是為了適應不同的數據字元串的特點。

下面就是一些例子了。

驗證網站: http://www.ip33.com/crc.html

『陸』 身份證號最後一位數字稱之為校驗碼,校驗碼的計算方式是怎樣的

按照相關規定,身份號是由17個數字和1個數字校驗碼組成的。而最後一位校驗碼,就是檢查身份證是否正確的主要依據。它的計算方法,主要是由前17位乘以不同的系數,最後的總和除以11。在這種情況下,得到的余數,就是校驗碼。

那麼我們在反推的時候,就可以用身份證號乘於系數,當最後得出的余數和末尾校驗碼不同時,就代表這個身份證,是一個假的身份證,不符合我們國家的標准。另外,余數對應的數字不同,並不是說余數就一定是最後一位身份證號碼。

3、為什麼除以11

看到整個計算過程,我們會發現,想要得出校驗碼,並非一件易事。不過在計算中,有人可能會提出疑問,最終的除以為什麼是取11,而不是其他數字。

其實這個問題的答案很簡單,結合校驗碼的功能,11是最容易檢測出問題的存在。同時,它可以覆蓋到大多數身份證,方便進行校驗。畢竟一個國家人口眾多,校驗碼要做到盡可能覆蓋所有人。

『柒』 校驗碼是怎麼算出來的

身份證第18位(校驗碼)的計算方法

1、將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十閉洞七位的系數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、將這17位數字和系數相乘的結果相加。

3、用加出來和除以11,看余數是多少?

4、余數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位身份證的號碼為1-0-X-9-8-7-6-5-4-3-2。

5、通過上面得知如果余數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果余數是10,身份證的最帶租後一位號碼就是2。
例如:某男性蠢態兆的身份證號碼是34052419800101001X。我們要看看這個身份證是不是合法的身份證。
首先我們得出前17位的乘積和是189,然後用189除以11得出的結果是17+2/11,也就是說其餘數是2。最後通過對應規則就可以知道余數2對應的數字是x。所以,可以判定這是一個合格的身份證號碼。

『捌』 有誰知道IMEI號校驗碼的計算方法

IMEI校驗碼演算法:
(1).將偶數位數字分別乘以2,分別計算個位數和十位數之和
(2).將奇數位攜如數字相加,再加上上一步算得的辯芹啟值
(3).如首慧果得出的數個位是0則校驗位為0,否則為10減去個位數
如:35 89 01 80 69 72 41 偶數位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,計算奇數位數字之和和偶數位個位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校驗位 10-3 = 7

熱點內容
存儲箱超市 發布:2023-06-08 09:49:09 瀏覽:340
xcode添加文件夾 發布:2023-06-08 09:47:22 瀏覽:290
隕石密碼一般是多少 發布:2023-06-08 09:46:39 瀏覽:664
java中取絕對值 發布:2023-06-08 09:43:09 瀏覽:923
4指演算法算卦 發布:2023-06-08 09:41:17 瀏覽:500
蘋果手機忘記密碼怎麼解 發布:2023-06-08 09:40:39 瀏覽:401
c語言兩數交換 發布:2023-06-08 09:37:23 瀏覽:261
明日科技php 發布:2023-06-08 09:31:06 瀏覽:690
手游御龍在天腳本 發布:2023-06-08 09:27:12 瀏覽:167
android單元格合並單元格 發布:2023-06-08 09:26:26 瀏覽:837