python如何計算校驗碼(校驗碼計算題)

本文目錄一覽:

身份證號碼尾號的校驗碼是由什麼公式計算出來的

校驗碼是根據前面十七位數字碼,按照ISO

7064:1983.MOD

11-2校驗碼計算出來的檢驗碼。

具體的公式舉例說明為:

某男性公民身份號碼本體碼為34052419800101001,首先按照公式計算:∑(ai×Wi)(mod

11),其中,i表示號碼字元從右至左包括校驗碼在內的位置序號;

a[i]表示第i位置上的號碼字元值;

W[i]示第i位置上的加權因子,其數值依據公式

W[i]

=

2^(i-1)

mod

(11)計算得出。

則,設R=∑(a[i]×W[i])(mod

11)

=

2,同時R的值【0

1

2

3

4

5

6

7

8

9

10】對應取值為【1

X

9

8

7

6

5

4

3

2】。

計算結果為2的校驗碼為X,所以該人員的公民身份號碼應該為

34052419800101001X。

擴展資料:

身份證號碼的結構和形式:

1、號碼的結構:公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。

2、地址碼:表示編碼對象常住戶口所在縣(縣級市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。

3、出生日期碼:表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。

4、順序碼:表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。

5、校驗碼:根據前面十七位數字碼,按照ISO

7064:1983.MOD

11-2校驗碼計算出來的檢驗碼。

參考資料來源:百度百科-身份證號碼

參考資料來源:百度百科-身份證校驗位

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

用Python校驗身份證號碼真偽

#這個演算法都給了,應該比較簡單吧。我也很菜,隨意寫了一個。異常沒做,你可以自##己加一下。做一些驗證過濾。不知道隨機是不是真是隨意隨機,我沒有按照身份證規##則做隨機。是真的隨機了18位。。。 如果你有規則,也可以自己寫一個。

import random

yushu=[x for x in range(0,11)] 

ma=[‘1′,’0′,’X’,’9′,’8′,’7′,’6′,’5′,’4′,’3′,’2′,’1′]

def yanzheng(nid):

dicma=dict(zip(yushu,ma))

sum=0

for x,y in enumerate(nid[:-1]):

sum+=((2**(18-x-1))%11)*int(y) #17位對應係數相乘的和

    if nid[-1]==dicma[sum%11]: #校驗碼對照

    return ‘%s True’%nid

    else:

    return ‘%s False’%nid

def readfile(fname):

f=open(fname,’rb’)

for line in f.readlines():

print  yanzheng(line.strip())

f.close()

def randnum():

idstr=”

for i in range(17): #前17位隨機

idstr+=str(random.randint(0,9))

idstr+=random.choice(ma) #最後一位從列表種隨意一個,因為有X

return idstr

if __name__==”__main__”:

nid=raw_input(‘Please enter your ID: ‘) #用戶輸入ID,沒做任何驗證

print yanzheng(nid)  #驗證身份證

readfile(‘id.txt’)   #從文件讀出來 再驗證

print yanzheng(randnum())  #隨機一個 在驗證

GPRMC校驗位如何計算 python csdn

如果是當作無符號整數來計算,則演算法要簡單很多,實際上都可以縮減為一句代碼的事。如果是當作帶符號整數來計算,則演算法要複雜一下,要處理各種上溢出和下溢出的情形。正如文章開頭指出的,不論使用哪種方式,最後的二進位表示都是一樣的。

所以一般情況下可以使用無符號整數來計算校驗和,簡單快速。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249026.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:31
下一篇 2024-12-12 13:31

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論