本文目錄一覽:
身份證號碼尾號的校驗碼是由什麼公式計算出來的
校驗碼是根據前面十七位數字碼,按照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-hant/n/249026.html