導航:首頁 > 源碼編譯 > 校驗演算法的缺點是

校驗演算法的缺點是

發布時間:2022-10-16 20:02:17

⑴ 2010電子商務師模擬試題及答案

一、單選題
1.中央處理單元(CPU)的兩個主要組成部分是運算器和()。C
(A)寄存器
(B)主存儲器
(C)控制器
(D)輔助存儲器

2.計算機網路是用通信線路把分散布置的多台獨立計算機及專用外部設備互連,並配以相應的()所構成的系統。D
(A)系統軟體
(B)應用軟體
(C)操作系統
(D)網路軟體

3.下列電子商務網站中,()屬水平B2B電子商務。(C)
(A)Dell電腦
(B)Cisco
(C)環球資源網
(D)上海書城

4.網路廣告策略屬於()的研究范圍。D
(A)價格策略
(B)渠道策略
(C)產品策略
(D)促銷策略

5.()是指利用交通工具一次向單一目的地長距離地運送大量貨物的移動。(C)
(A)運輸
(B)配送
(C)輸送
(D)物流

6.在市內運輸中,由生產廠經由物流企業(如配送中心)為用戶提供商品時,從配送中心到用戶之間的物品空間移動稱為()。(C)
(A)運輸
(B)輸送
(C)配送
(D)物流

7.企圖利用漏洞達到惡意目的的威脅代理稱之為()。(B)
(A)郵件爆炸
(B)攻擊
(C)漏洞
(D)威脅

8.電子商務系統()保護數據不被篡改、破壞和非法復制。 C
(A)硬體安全
(B)運行安全
(C)軟體安全
(D)安全立法

9.電子商務過程中,人們需要用()來相互證明各自的身份。(C)
(A)電子郵箱賬號
(B)電子指紋
(C)電子簽字機制
(D)IP地址

10.典型的電子商務支付應該是()。(D)
(A)銀行轉帳
(B)電話支付
(C)貨到付款
(D)網上支付

11.在HTML中,()是網頁主體的標記。(D)
(A)<head>
(B)<title>
(C)<html>
(D)<body>

12.在 HTML中,type屬性用來顯示不同形狀的項目符號,它使用在()標記中。(C)
(A)<ul>
(B)<p>
(C)<li>
(D)<ol>

13.在 HTML中,()標記符是非成對標記符。(A)
(A)<br>
(B)<p>
(C)<ul>
(D)<a>

14.使用外部樣式文件需要在文檔的頭部區域使用的標記是()。(A)
(A)<link>
(B)<class>
(C)<style>
(D)<a>

15.樣式表文件的後綴名是()。(A)
(A)css
(B)htm
(C)html
(D)asp

16.()無法單獨存在,必須附屬在HTML中執行。 A
(A)VBScript
(B)javaScript
(C)Delphi
(D)C語言

17.FTP常用的服務是()。(B)
(A)超文本傳輸
(B)下載
(C)ls
(D)遠程登錄

18.在()中計算機可以使用超終端通信。(A)
(A)對等網路
(B)廣播式網路
(C)非對等網路
(D)VPN

19.()類郵件列表,只有經過郵件列表管理者許可的電子郵件才能發送給其他訂戶。C
(A)公開
(B)阻止
(C)管制
(D)封閉

20.移動存儲設備最大的優勢在於()。(C)
(A)標准存儲單位成本低
(B)存儲量大
(C)易保存,受外界影響更小
(D)方便易用

21.關系資料庫使用()表示實體及其聯系。(C)
(A)記錄
(B)欄位
(C)數據表
(D)SQL

22.新聞組中()頂級類別表示關於新聞組本身的主題。(B)
(A)alt
(B)news
(C)misc
(D)talk

23.網路市場調研問卷的問題一般不要超過()個。C
(A)10
(B)15
(C)20
(D)30

24.在對競爭對手的調研活動中,() 發揮著重要作用。(B)
(A)網上直接調研
(B)網上間接調研
(C)E-mail問卷
(D)Focus-Group

25.在網路調研中,()一般用來再次向填寫者表示感謝或致意,此外註明公司的標志性信息(如公司名稱、網站、聯系方式),這是宣傳公司形象的好機會。(D)
(A)卷首說明
(B)調研問題
(C)調研內容
(D)結束語

26.()主要是為顧客提供一個友好的購物環境,包括用戶注冊、店面瀏覽,商品定購等部分。(A)
(A)前台商務系統
(B)後台商務系統
(C)店面管理系統
(D)站點管理系統

27.()是為了讓上網的用戶不用等到多媒體文件完全下載完就開始播放的一種技術。D
(A)條形碼技術
(B)射頻技術
(C)多媒體技術
(D)動畫流技術

28.因為網路廣告()的特徵,使得公司在網路上許多位置放置公司的廣告和相關產品介紹。(C)
(A)回饋快
(B)效率高
(C)成本低
(D)交互強

29.物流信息系統分析工作的總結稱之為()。(B)
(A)物流環境分析報告
(B)信息分析報告
(C)數據流分析報告
(D)業務分析報告

30.在網上單證設計過程中,要注意保證訂單在商城未確認前的()。(C)
(A)可轉換性
(B)可傳遞性
(C)可修改性
(D)可追述性

31.客戶的購買記錄屬於()信息。(D)
(A)客戶的靜態
(B)客戶的操作
(C)客戶的動態
(D)客戶的行為

32.電子合同是通過計算機網路系統訂立的、以()的方式生成、儲存或傳遞的合同。(D)
(A)數據文件
(B)數字電文
(C)數字文件
(D)數據電文

33.數字化信息附著在軟體光碟上,稱為()。A
(A)有形信息產品
(B)無形信息產品
(C)非信息產品
(D)信息服務

34.在電子商務中,合同的()發生了極大的變化。(C)
(A)意義
(B)作用
(C)形式
(D)功能

35.()是SSL協議的基本特點。(D)
(A)能對通信雙方的身份進行認證
(B)進行協商的雙方的秘密是安全的
(C)協商是可靠的
(D)連接是專用的

36.SET協議是在()之上的應用層的網路標准協議。(D)
(A)數據鏈路層
(B)物理層
(C)傳輸層
(D)對話層

37.安全電子交易是基於互聯網的支付,是授權業務信息傳輸的安全標准,它採用()公開密鑰體系對通信雙方進行認證。(D)
(A)HASH
(B)DES
(C)RC4
(D)RSA

38.下列屬於網路客戶服務工具的是()。A
(A)FAQ
(B)ERP
(C)CRM
(D)SCM

39.()是指完成交易之後為顧客提供的服務。主要包括產品的技術支持和技術服務及為客戶提供的增值服務。(D)
(A)售前服務
(B)售中服務
(C)售後服務
(D)溝通服務

40.網路客戶反饋信息通常都是以()方式傳遞的。(B)
(A)電話
(B)E-mail
(C)上門訪問
(D)郵局郵件

41.()條形碼包括生產日期、有效日期、運輸包裝的序號、重量、地址等信息。(D)
(A)EAN-13
(B)DUN-14
(C)DUN-16
(D)EAN-128

42.配裝成本中包括()。A
(A)配裝材料費用
(B)配送間接費用
(C)物流中心製造費用
(D)分揀設備折舊費用

43.物流運輸企業與供應鏈參與各方整合在一起形成( )。(C)
(A)物流企業
(B)供應鏈結合體
(C)第三方物流
(D)物流供應鏈

44.條碼是由一組規則的、不同寬度的條和空組成的標記,其中對光線反射率低的是( )。(A)
(A)條
(B)空
(C)相同
(D)粗條

45.電子訂貨系統簡稱是()。(D)
(A)POS
(B)EPS
(C)GPS
(D)EOS
46.()屬於物流組織結構與功能分析的主要內容。(A)
(A)物流數據分析
(B)組織結構分析
(C)業務過程與組織結構之間的聯系分析
(D)業務流程分析

47.應用()技術的車輛運行管理系統只適用於小范圍的通信聯絡。A
(A)MCA
(B)通信衛星
(C)GPS
(D)GIS

48.企業采購和付款業務循環內部控制使用的基本文件中,()是由采購部門編制的授權供應方提供商品的預先編號的文件。(B)
(A)請購單
(B)訂單
(C)驗收單
(D)借項通知單

49.采購申請模塊的功能包括()。D
(A)對於已通過的采購申請,郵件通知申請者
(B)對於已通過的采購申請,提交給采購管理模塊
(C)制定年度或月份采購計劃
(D)接受企業ERP系統自動提交的原材料采購申請

50.報價采購中,報價單的有效期是指()。(A)
(A)報價送達對方所在地時的日期
(B)報價日期
(C)報價單發送日期
(D)開標日期

51.逾期率是供應商評價指標中的()指標。(C)
(A)價格
(B)品質
(C)交期交量
(D)配合度

52.()是企業對供應商最基本的行為約束,也是二者保持合作關系的基本保障。(C)
(A)供應商評價體系
(B)供應商考核體系
(C)供應商行為准則
(D)供應商行業規范

53.設計加密系統時,真正需要保密的是()。A
(A)密鑰
(B)加密演算法
(C)解密演算法
(D)密文

54.使用DES演算法加密的演算法步驟是( )。(A)
(A)將明文分組、初始置換,迭代過程,逆初始置換,輸出64位碼的密文
(B)初始置換,將明文分組、逆初始置換,迭代過程,輸出64位碼的密文
(C)初始置換,迭代過程,將明文分組、逆初始置換,輸出64位碼的密文
(D)將明文分組、初始置換,逆初始置換迭代過程,,輸出64位碼的密文

55.在安全電子郵件中,收信的協議是( )。(C)
(A)SMTP
(B)HTTP
(C)POP3
(D)FTP

56.OSI是( )。(B)
(A)國際標准化組織
(B)安全體系結構
(C)質量管理體系
(D)國家標準的環境管理體系

57.瞬時復制技術是( )。(A)
(A)使計算機在某一災難時刻自動復制數據的技術
(B)快速產生和維護一份或多份資料庫數據的復制
(C)在遠程備份中心提供主數據中心的磁碟鏡像
(D)人工快速復制備份數據

58.用特徵代碼法檢測病毒()。(C)
(A)能檢測未知病毒
(B)誤報率高
(C)可識別病毒的名稱
(D)不能做解毒處理

59.引導型病毒將病毒寄生在硬碟( )。(A)
(A)邏輯0扇區或軟體0扇區
(B)邏輯1扇區或軟體1扇區
(C)邏輯2扇區或軟體2扇區
(D)邏輯3扇區或軟體3扇區

60.判斷病毒的觸發條件,實施病毒的破壞功能的模塊是( )。(C)
(A)傳染模塊
(B)引導模塊
(C)表現模塊
(D)以上都不是

二、多選題
61.計算機網路的分類標准很多,按拓撲結構可分為()。(BCD)
(A)廣播型
(B)星型
(C)匯流排型
(D)環型

62.電子商務的基本組成要素包括用戶、商家以及()等。(ABCD)
(A)物流配送
(B)認證中心
(C)銀行
(D)網路

63.網路產品策略包括()。AD
(A)產品選擇策略
(B)網路直銷策略
(C)網路廣告策略
(D)銷售服務策略

64.計算機信息系統安全產品是用來保護計算機信息系統安全的專用的硬體和軟體產品,如()。(AC)
(A)網路防火牆
(B)解密軟體
(C)防病毒軟體
(D)壓縮軟體

65.在電子商務條件下,買方應當承擔的義務包括()。(ABD)
(A)按照網路交易規定方式支付價款的義務
(B)按照合同規定的時間、地點和方式接受標的物的義務
(C)對標的物的質量承擔擔保義務
(D)對標的物驗收的義務

66.下列關於字體標記color屬性的描述正確的有()。 ACD
(A)定義文字的顏色
(B)定義文字的字體
(C)可以用顏色的英文名稱表示顏色
(D)可以用16進制的RGB代碼表示顏色

67.在 HTML中,()是表格使用的標記。(BCD)
(A)<ul>
(B)<table>
(C)<tr>
(D)<td>

68.在FrontPage中,能加入DHTML效果的事件有()。(ABCD)
(A)單擊
(B)雙擊
(C)滑鼠懸停
(D)網頁載入

69.關於CSS的應用,正確的說法有()。(ABCD)
(A)外部樣式是獨立的CSS文件
(B)內聯式樣式只包含在與它有關的標記內
(C)應用嵌入式樣式,要將CSS代碼置於<HEAD>和</HEAD>之間
(D)應用嵌入式樣式,要將CSS代碼置於<!--和-->之間

70.網路下載軟體JetCar具有的特點包括()。(ACD)
(A)支持斷線續傳
(B)能創建有限數目的類別
(C)支持MMS和RTSP協議
(D)具有預防病毒侵害的安全機制

71.下列關於音頻技術的描述正確的有()。 BCD
(A)存儲介質磁性變化不影響模擬音頻的回放質量
(B)MIDI音樂是電腦特有的
(C)數字音頻技術將聲波波形轉換成二進制數據
(D)Sound Forge是一種音頻編輯工具

72.以下()SQL語句屬於數據操縱語言。(BD)
(A)Alter
(B)Select
(C)Create
(D)Update

73.撰寫網路市場調研計劃書需要()。ABCD
(A)確定調研的目標和范圍
(B)制定調研計劃
(C)說明調研人員組成
(D)明確調研時間和資金限制

74.網上市場調研項目的范圍包括(ABCD)
(A)背景
(B)目的
(C)委託人
(D)項目負責人

75.網上市場調研的相關計劃有()。(ABC)
(A)時間計劃
(B)溝通計劃
(C)人力資源計劃
(D)營銷計劃

76.網路感性訴求廣告的創意方法有()。(ABC)
(A)感知效應
(B)情趣效應
(C)情感效應
(D)利益效應

77.進行網上購物的消費者可以分為()等類型。(ABCD)
(A)簡單型
(B)沖浪型
(C)議價型
(D)接入型

78.設計網上商店單證種類和格式需要()AB
(A)列出所需網上單證種類的名稱
(B)列出各種單證的有關數據項
(C)列出各網上單證為方便客戶所需要的提示語內容
(D)確定各網上單證色彩、字體、字形

79.網上訂單的後台處理的過程主要包括()等。(ACD)
(A)訂單准備
(B)訂單傳遞
(C)訂單儲存
(D)訂單登錄

80.認證機構一般需承擔()。(ABCD)
(A)信息披露義務
(B)信息通知義務
(C)安全義務
(D)舉證義務

81.電子合同的特點有()。ACD
(A)電子數據易消失
(B)電子數據不易改動
(C)電子合同局限性
(D)可能受到計算機病毒攻擊

82.SET最初是由()合作開發完成的。(AB)
(A)VISA CARD
(B)MASTER CARD
(C)AMERICAN EXPRESS CARD
(D)CITIBANK CARD

83.SET通過使用()方式加密保證了數據的保密性。(AD)
(A)公共密鑰
(B)公開密鑰
(C)私有密鑰
(D)對稱密鑰

84.處理客戶投訴的原則包括()。ABCD
(A)預防原則
(B)及時原則
(C)責任原則
(D)管理原則

85.FAQ是指利用網站頁面向顧客提供有關()等問題的現成答案。(ABC)
(A)產品的使用
(B)技術支持
(C)企業情況
(D)訂單狀態

86.網上售後服務的主要特點包括()。(ABCD)
(A)方便
(B)直接
(C)個性化
(D)快捷

87.條碼在倉庫內部管理中的作用是()。(AC)
(A)存貨盤點形成盤點報告
(B)方便入庫
(C)出庫備貨
(D)條理存放

88.物流信息按照物流的功能分類可以分為()。(ABCD)
(A)計劃信息
(B)控制及作業信息
(C)統計信息
(D)支持信息

89.判定配送合理與否的因素是多方面的,()因素屬於合理范疇。(BCD)
(A)資金周轉慢
(B)庫存周轉快於原來各企業庫存周轉
(C)缺貨次數下降
(D)即時配送速度快

90.選擇配送方法包括()。BCD
(A)確定物流服務商
(B)確定配貨作業方法
(C)確定車輛配裝方法
(D)確定配送路線

91.企業可以()了解供應商的能力,選擇合適的供應商。(ABCD)
(A)根據供應商的信譽對比類似產品的歷史情況及其他用戶的使用情況
(B)根據供應商提供的樣品進行評價
(C)對供應商的能力進行現場調查和評價
(D)根據是否取得有關質量認證機構的質量體系認證

92.防止企業采購中暗箱操作的措施「三統一分」,其中「三統」是指所有采購商品要()。(BCD)
(A)統一控制費用
(B)統一采購驗收
(C)統一審核結算
(D)統一轉賬付款

93.對供應商進行調查,調查表應盡量用()進行表述。(BC)
(A)文字
(B)數據
(C)量值
(D)實例

94.電子商務信息保密性需求包括()。AB
(A)信息的隱私問題
(B)交易內容的保密性
(C)伺服器的真實性
(D)交易雙方身份的真實性

95.對電子郵件的加密主要方法有( )。(AB)
(A)使用PGP插件
(B)使用數字證書
(C)用系統自帶的加密功能
(D)用壓縮加密軟體

96.安全交易體系中具有代表性的交易規范協議有( )。(BC)
(A)TCP/IP
(B)SET
(C)SSL
(D)HTTP

97.支撐軟體的維護需要做到()。ABCD
(A)定期清理日誌文件
(B)定期清理臨時文件
(C)定期執行整理文件系統
(D)處理運行中死機情況

98.計算機安全是指一種確定狀態,使計算機化數據和程序文件不致被()訪問、獲取或修改。(BCD)
(A)授權人員
(B)計算機
(C)程序
(D)非授權人員

99.校驗演算法的缺點是( )。(ABD)
(A)不能識別病毒名稱
(B)不能對付隱蔽性病毒
(C)不能發現未知病毒
(D)容易誤報警

100.堡壘主機的系統軟體可用於( )。(ABC)
(A)維護系統日誌
(B)硬體復制日誌
(C)遠程日誌
(D)用戶操作日誌

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

⑶ DES和AES演算法的比較,各自優缺點有哪些

一、數據加密標准不同

1、DES演算法的入口參數有三個:Key、Data、Mode。

其中Key為7個位元組共56位,是DES演算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。

2、AES的基本要求是,採用對稱分組密碼體制,密鑰的長度最少支持為128、192、256,分組長度128位,演算法應易於各種硬體和軟體實現。

因此AES的密鑰長度比DES大, 它也可設定為32比特的任意倍數,最小值為128比特,最大值為256 比特,所以用窮舉法是不可能破解的。

二、運行速度不同

1、作為分組密碼,DES的加密單位僅有64位二進制,這對於數據傳輸來說太小,因為每個分組僅含8個字元,而且其中某些位還要用於奇偶校驗或其他通訊開銷。處理速度慢、加密耗時

2、AES對內存的需求非常低,運算速度快,在有反饋模式、無反饋模式的軟硬體中,Rijndael都表現出非常好的性能。

三、適用范圍不同

1、數據加密標准,速度較快,適用於加密大量數據的場合。DES在安全上是脆弱的,但由於快速DES晶元的大量生產,使得DES仍能暫時繼續使用,為提高安全強度,通常使用獨立密鑰的三級DES

2、AES 適用於8位的小型單片機或者普通的32位微處理器,並且適合用專門的硬體實現,硬體實現能夠使其吞吐量(每秒可以到達的加密/解密bit數)達到十億量級。同樣,其也適用於RFID系統。

⑷ 校驗演算法的缺點

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

⑸ 哈希表、哈希演算法、一致性哈希表

    散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。它通過把關鍵碼映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數(哈希函數),存放記錄的數組叫做散列表。

  優點:

        哈希表可以提供快速的操作。

缺點:

        哈希表通常是基於數組的,數組創建後難於擴展。

        也沒有一種簡便的方法可以以任何一種順序〔例如從小到大)遍歷表中的數據項 。

    綜上, 如果不需要有序遍歷數據,井且可以提前預測數據量的大小。那麼哈希表在速度和易用性方面是無與倫比的。

        1. 使用哈希函數將被查找的鍵轉換為數組的索引。

        2. 處理哈希碰撞沖突。

    若關鍵字為 k ,則其值存放在 f(k) 的存儲位置上。由此,不需比較便可直接取得所查記錄。稱這個對應關系 f 為散列函數,按這個思想建立的表為散列表。

    若對於關鍵字集合中的任一個關鍵字,經散列函數映象到地址集合中任何一個地址的概率是相等的,則稱此類散列函數為 均勻散列函數 (Uniform Hash function),這就是使關鍵字經過散列函數得到一個"隨機的地址",從而減少碰撞。

散列函數能使對一個數據序列的訪問過程更加迅速有效,通過散列函數,數據元素將被更快地定位。

一個好的散列函數一般應該考慮下列因素 :

    1.計算簡單,以便提高轉換速度。

    2.關鍵詞對應的地址空間分布均勻,以盡量減少沖突。

1.   直接定址法

    取關鍵字或者關鍵字的某個線性函數值作為哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b為整數),這種散列函數也叫做自身函數.如果H(Key)的哈希地址上已經有值了,那麼就往下一個位置找,直到找到H(Key)的位置沒有值了就把元素放進去。

2.   數字分析法

    數字分析法就是找出數字的規律,盡可能利用這些數據來構造沖突幾率較低的散列地址。

3.   平方取中法

    取關鍵字平方後的中間幾位作為散列地址。這種方法的原理是通過取平方擴大差別,平方值的中間幾位和這個數的每一位都相關,則對不同的關鍵字得到的哈希函數值不易產生沖突,由此產生的哈希地址也較為均勻。該方法適用於關鍵字中的每一位都有某些數字重復出現頻度很高的現象。

4.   折疊法

    折疊法是將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(注意:疊加和時去除進位)作為散列地址。

    數位疊加可以有移位疊加和間界疊加兩種方法。移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回折疊,然後對齊相加。

    該方法適用於關鍵字特別多的情況。

5.   隨機數法

    選擇一個隨機數,作為散列地址,通常用於關鍵字長度不同的場合。

6.   除留余數法

    取關鍵字被某個不大於散列表表長m的數p除後所得的余數為散列地址.即H(Key)=Key MOD p,p<=m.不僅可以對關鍵字直接取模,也可在折疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選得不好,則很容易產生沖突。

    對不同的關鍵字可能得到同一散列地址,即 k1≠k2 ,而 f(k1)=f(k2) ,這種現象稱為碰撞(英語:Collision)。具有相同函數值的關鍵字對該散列函數來說稱做同義詞。

    通過構造性能良好的散列函數,可以減少沖突,但一般不可能完全避免沖突,因此解決沖突是哈希法的另一個關鍵問題。 創建哈希表和查找哈希表都會遇到沖突,兩種情況下解決沖突的方法應該一致。

下面以創建哈希表為例,說明解決沖突的方法。

1.開放定址法

    這種方法也稱再散列法,其基本思想是:當關鍵字key的哈希地址p=H(key)出現沖突時,以p為基礎,產生另一個哈希地址p1,如果p1仍然沖突,再以p為基礎,產生另一個哈希地址p2,…,直到找出一個不沖突的哈希地址pi ,將相應元素存入其中。這種方法有一個通用的再散列函數形式:Hi=(H(key)+di)%m   i=1,2,…,m-1,其中H(key)為哈希函數,m 為表長,di稱為增量序列,i為碰撞次數。增量序列的取值方式不同,相應的再散列方式也不同。增量序列主要有以下幾種:

    (1) 線性探測再散列

        di=1,2,3,…,m-1

        這種方法的特點是:沖突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。

    (2)二次探測再散列

        di=12,-12,22,-22,…,k2,-k2( k<=m/2 )

        這種方法的特點是:沖突發生時,在表的左右進行跳躍式探測,比較靈活。

    (3)偽隨機探測再散列

        di=偽隨機數序列。

    線性探測再散列的 優點 是:只要哈希表不滿,就一定能找到一個不沖突的哈希地址,而二次探測再散列和偽隨機探測再散列則不一定。線性探測再散列容易產生「二次聚集」,即在處理同義詞的沖突時又導致非同義詞的沖突。

    其實除了上面的幾種方法,開放定址法還有很多變種,不過都是對di有不同的表示方法。(如雙散列探測法:di=i*h2(k))

2.再哈希法

    這種方法是同時構造多個不同的哈希函數:Hi=RHi(key),i=1,2,3,…,n。

    當哈希地址H1=RH1(key)發生沖突時,再計算H2=RH2(key)……,直到沖突不再產生。這種方法不易產生聚集,但增加了計算時間。

 3.鏈地址法(拉鏈法)

    這種方法的基本思想是將所有哈希地址相同的元素構成一個稱為同義詞鏈的單鏈表,並將單鏈表的頭指針存在哈希表(數組)中,因而查找、插入和刪除主要在同義詞鏈中進行。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數組T[0..m-1]。凡是散列地址為i的結點,均插入到以T[i]為頭指針的單鏈表中。T中各分量的初值均應為空指針。鏈地址法適用於經常進行插入和刪除的情況。

     拉鏈法的優點

        與開放定址法相比,拉鏈法有如下幾個優點:

            (1)拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;

            (2)由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;

            (3)開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中理論上可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;(散列表的裝填因子定義為:α= 填入表中的元素個數 / 散列表的長度)

註:HashMap默認裝填因子是0.75。

            (4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。而對開放定址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置為空,否則將截斷在它之後填入散列表的同義詞結點的查找路徑。這是因為各種開放定址法中,空地址單元都被理解沒有查找到元素。 因此在用開放定址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

     拉鏈法的缺點

        拉鏈法的缺點是:指針需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,此時將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。

4、建立公共溢出區

    這種方法的基本思想是:將哈希表分為基本表和溢出表兩部分,凡是和基本表發生沖突的元素,一律填入溢出表(在這個方法裡面是把元素分開兩個表來存儲)。

    散列表的查找過程基本上和造表過程相同。一些關鍵碼可通過散列函數轉換的地址直接找到,另一些關鍵碼在散列函數得到的地址上產生了沖突,需要按處理沖突的方法進行查找。在介紹的三種處理沖突的方法中,產生沖突後的查找仍然是給定值與關鍵碼進行比較的過程。所以,對散列表查找效率的量度,依然用平均查找長度來衡量。

    查找過程中,關鍵碼的比較次數,取決於產生沖突的多少,產生的沖突少,查找效率就高,產生的沖突多,查找效率就低。因此,影響產生沖突多少的因素,也就是影響查找效率的因素。

影響產生沖突多少有以下三個因素:

    1. 散列函數是否均勻;

    2. 處理沖突的方法;

    3. 散列表的裝填因子。

     散列表的裝填因子

        定義為:α= 填入表中的元素個數 / 散列表的長度

        α是散列表裝滿程度的標志因子。由於表長是定值,α與"填入表中的元素個數"成正比,所以,α越大,填入表中的元素較多,產生沖突的可能性就越大;α越小,填入表中的元素較少,產生沖突的可能性就越小。

        實際上,散列表的平均查找長度是裝填因子α的函數,只是不同處理沖突的方法有不同的函數。

    這個HASH演算法不是大學里數據結構課里那個HASH表的演算法。這里的HASH演算法是密碼學的基礎,了解了hash基本定義,就不能不提到一些著名的hash演算法,MD5 和 SHA-1 可以說是目前應用最廣泛的Hash演算法,而它們都是以 MD4 為基礎設計的。

Hash演算法在信息安全方面的應用主要體現在以下的3個方面:

     ⑴  文件校驗

        我們比較熟悉的校驗演算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗 數據篡改 的能力,它們一定程度上能檢測出數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。

        MD5 Hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性 校驗和 (Checksum)演算法,不少Unix系統有提供計算md5 checksum的命令

     ⑵  數字簽名

        Hash 演算法也是現代密碼體系中的一個重要組成部分。由於非對稱演算法的運算速度較慢,所以在 數字簽名 協議中,單向散列函數扮演了一個重要的角色。對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。

     ⑶ 鑒權協議

        如下的鑒權協議又被稱作挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。

    一致性哈希表簡稱DHT,主要應用於分布式緩存中,可以用來解決分布式存儲結構下動態增加和刪除節點所帶來的問題。比如,一個分布式的存儲系統,要將數據存儲到具體的節點上,如果採用普通的hash方法,將數據映射到具體的節點上,如key%N(key是數據的key,N是機器節點數),如果有一個機器加入或退出這個集群,則所有的數據映射都無效了,如果是持久化存儲則要做數據遷移,如果是分布式緩存,則其他緩存就失效了。

判定哈希演算法好壞的四個定義 :

    1、平衡性(Balance):平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。

    2、單調性(Monotonicity):單調性是指如果已經有一些內容通過哈希分派到了相應的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映射到原有的或者新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區。

    3、分散性(Spread):在分布式環境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當終端希望通過哈希過程將內容映射到緩沖上時,由於不同終端所見的緩沖范圍有可能不同,從而導致哈希的結果不一致,最終的結果是相同的內容被不同的終端映射到不同的緩沖區中。這種情況顯然是應該避免的,因為它導致相同內容被存儲到不同緩沖中去,降低了系統存儲的效率。 分散性的定義就是上述情況發生的嚴重程度。好的哈希演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。

    4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩沖區中,那麼對於一個特定的緩沖區而言,也可能被不同的用戶映射為不同的內容。與分散性一樣,這種情況也是應當避免的, 因此好的哈希演算法應能夠盡量降低緩沖的負荷。

    在分布式集群中,對機器的添加刪除,或者機器故障後自動脫離集群這些操作是分布式集群管理最基本的功能。如果採用常用的hash取模演算法,那麼在有機器添加或者刪除後,很多原有的數據就無法找到了,這樣嚴重的違反了單調性原則。接下來主要說明一下一致性哈希演算法是如何設計的。

以SpyMemcached的ketama演算法來說,思路是這樣的:

把數據用hash函數,映射到一個很大的空間里,如圖所示。數據的存儲時,先得到一個hash值,對應到這個環中的每個位置,如k1對應到了圖中所示的位置,然後沿順時針找到一個機器節點B,將k1存儲到B這個節點中。

如果B節點宕機了,則B上的數據就會落到C節點上,如下圖所示:

這樣,只會影響C節點,對其他的節點A,D的數據不會造成影響。然而,這又會造成一個「雪崩」的情況,即C節點由於承擔了B節點的數據,所以C節點的負載會變高,C節點很容易也宕機,這樣依次下去,這樣造成整個集群都掛了。

為此,引入了「虛擬節點」的概念:即把想像在這個環上有很多「虛擬節點」,數據的存儲是沿著環的順時針方向找一個虛擬節點,每個虛擬節點都會關聯到一個真實節點,如下圖所使用:

圖中的A1、A2、B1、B2、C1、C2、D1、D2都是虛擬節點,機器A負載存儲A1、A2的數據,機器B負載存儲B1、B2的數據,機器C負載存儲C1、C2的數據。由於這些虛擬節點數量很多,均勻分布,因此不會造成「雪崩」現象。

⑹ 關於CRC效驗

為保證傳輸過程的正確性,需要對通信過程進行差錯控制。差錯控制最常用的方法是自動請求重發方式(ARQ)、向前糾錯方式(FEC)和混合糾錯(HEC)。在傳輸過程誤碼率比較低時,用FEC方式比較理想。在傳輸過程誤碼率較高時,採用FEC容易出現「亂糾」現象。HEC方式則是ARQ和FEC的結合。在許多數字通信中,廣泛採用ARQ方式,此時的差錯控制只需要檢錯功能。實現檢錯功能的差錯控制方法很多,傳統的有:奇偶校驗、校驗和檢測、重復碼校驗、恆比碼校驗、行列冗餘碼校驗等,這些方法都是增加數據的冗餘量,將校驗碼和數據一起發送到接受端。接受端對接受到的數據進行相同校驗,再將得到的校驗碼和接受到的校驗碼比較,如果二者一致則認為傳輸正確。但這些方法都有各自的缺點,誤判的概率比較高。
循環冗餘校驗CRC(Cyclic Rendancy Check)是由分組線性碼的分支而來,其主要應用是二元碼組。編碼簡單且誤判概率很低,在通信系統中得到了廣泛的應用。下面重點介紹了CRC校驗的原理及其演算法實現。

CRC校驗可以100%地檢測出所有奇數個隨機錯誤和長度小於等於k(k為g(x)的階數)的突發錯誤。所以CRC的生成多項式的階數越高,那麼誤判的概率就越小。

CRC代碼的一些基本概念和運算:

CRC多項式:

例:

代碼:1010111 對應的多項式為:X6+X4+X2+X+1

多項式X5+X3+X2+X1+1對應的代碼為101111

CRC生成多項式:

首位和最後一位必須是1。CRC生成多項式是給定的,在傳輸過程中不變,即發送和接收端生成碼相同。

一些常用的校驗碼為:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

CRC的運算本質是異或運算(模2除法)

例:原信息碼為1011001

生成碼為11001

校驗碼計算過程

① 將信息碼左移4位(生成碼長-1);得到10110010000

② 異或運算

10110010000

11001

01111010000(前面的數進行異或運算,後面的直接抄下來)

11001

0011110000(和生成碼異或運算的必須從1開始)

11001

00111000

11001

001010

這樣得到的結果為1010,即為所需要的校驗碼,添加到信息碼後,得到發送的代碼為:

10110011010

我把上面的手算過程用c#寫了一段程序,如下:

using System;

namespace mainClass
{
public class mainProgress
{
public static void Main()
{
byte[] msg={1,0,1,1,0,0,1};//信息碼
byte[] gmsg=new byte[msg.Length+4];
crc c = new crc();
gmsg=c.code(msg);
Console.Write("編碼後字元串為:");
for (int i = 0; i < gmsg.Length; i++)
{
Console.Write("{0}", gmsg[i].ToString());
}
Console.Write("\n");
byte[] gmsg1={ 1, 0, 1, 1, 0, 1, 1 };//接收到的代碼
bool r = c.det(gmsg1);
if (r)
{
Console.WriteLine("傳輸正確");
}
else
{ Console.WriteLine("傳輸錯誤"); }
}
}

public class crc//CRC編碼類
{
private byte[] g = { 1,1,0,0,1};//生成碼
public byte[] code(byte[] msg)//編碼
{
byte[] gmsg=new byte[g.Length+msg.Length-1];
msg.CopyTo(gmsg, 0);//
for (int i = 0; i < msg.Length; i++)//完成異或運算,即模2除法
{
if (gmsg[i] == 1)
{
for (int j = 0; j < g.Length; j++)
{
if (gmsg[i + j] == g[j])
gmsg[i + j] = 0;
else
gmsg[i + j] = 1;
}
}
}
msg.CopyTo(gmsg, 0);
return gmsg;
}
private bool f=true;

//接收端檢測
public bool det(byte[] gmsg)
{
for (int i = 0; i < gmsg.Length - g.Length+1; i++)
{
if(gmsg[i]==0)
continue;
for (int j = 0; j < g.Length; j++)
{
if (gmsg[i + j] == g[j])
gmsg[i + j] = 0;
else
gmsg[i + j] = 1;
}
}
for (int i = 0; i < gmsg.Length; i++)
{
if (gmsg[i] == 1)
f = false;
}
return f;
}

}
}

⑺ 常用數據校驗方法有哪些

奇偶校驗」。內存中最小的單位是比特,也稱為「位」,位有隻有兩種狀態分別以1和0來標示,每8個連續的比特叫做一個位元組(byte)。不帶奇偶校驗的內存每個位元組只有8位,如果其某一位存儲了錯誤的值,就會導致其存儲的相應數據發生變化,進而導致應用程序發生錯誤。而奇偶校驗就是在每一位元組(8位)之外又增加了一位作為錯誤檢測位。在某位元組中存儲數據之後,在其8個位上存儲的數據是固定的,因為位只能有兩種狀態1或0,假設存儲的數據用位標示為1、1、 1、0、0、1、0、1,那麼把每個位相加(1+1+1+0+0+1+0+1=5),結果是奇數,那麼在校驗位定義為1,反之為0。當CPU讀取存儲的數據時,它會再次把前8位中存儲的數據相加,計算結果是否與校驗位相一致。從而一定程度上能檢測出內存錯誤,奇偶校驗只能檢測出錯誤而無法對其進行修正,同時雖然雙位同時發生錯誤的概率相當低,但奇偶校驗卻無法檢測出雙位錯誤。

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc 發明,由 MD2/MD3/MD4 發展而來的。MD5的實際應用是對一段Message(位元組串)產生fingerprint(指紋),可以防止被「篡改」。舉個例子,天天安全網提供下載的MD5校驗值軟體WinMD5.zip,其MD5值是,但你下載該軟體後計算MD5 發現其值卻是,那說明該ZIP已經被他人修改過,那還用不用該軟體那你可自己琢磨著看啦。

MD5廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,來驗證該用戶的合法性。

MD5校驗值軟體WinMD5.zip漢化版,使用極其簡單,運行該軟體後,把需要計算MD5值的文件用滑鼠拖到正在處理的框里邊,下面將直接顯示其MD5值以及所測試的文件名稱,可以保留多個文件測試的MD5值,選定所需要復制的MD5值,用CTRL+C就可以復制到其它地方了。
參考資料:http://..com/question/3933661.html

CRC演算法原理及C語言實現 -來自(我愛單片機)

摘 要 本文從理論上推導出CRC演算法實現原理,給出三種分別適應不同計算機或微控制器硬體環境的C語言程序。讀者更能根據本演算法原理,用不同的語言編寫出獨特風格更加實用的CRC計算程序。
關鍵詞 CRC 演算法 C語言
1 引言
循環冗餘碼CRC檢驗技術廣泛應用於測控及通信領域。CRC計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支持下實現CRC檢驗,關鍵的問題就是如何通過軟體來完成CRC計算,也就是CRC演算法的問題。
這里將提供三種演算法,它們稍有不同,一種適用於程序空間十分苛刻但CRC計算速度要求不高的微控制器系統,另一種適用於程序空間較大且CRC計算速度要求較高的計算機或微控制器系統,最後一種是適用於程序空間不太大,且CRC計算速度又不可以太慢的微控制器系統。
2 CRC簡介
CRC 校驗的基本思想是利用線性編碼理論,在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的監督碼(既CRC碼)r位,並附在信息後邊,構成一個新的二進制碼序列數共(k+r)位,最後發送出去。在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。
16位的CRC碼產生的規則是先將要發送的二進制序列數左移16位(既乘以 )後,再除以一個多項式,最後所得到的余數既是CRC碼,如式(2-1)式所示,其中B(X)表示n位的二進制序列數,G(X)為多項式,Q(X)為整數,R(X)是余數(既CRC碼)。
(2-1)
求CRC 碼所採用模2加減運演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。生成CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼。本文不討論32位的CRC演算法,有興趣的朋友可以根據本文的思路自己去推導計算方法。
CRC-16:(美國二進制同步系統中採用)
CRC-CCITT:(由歐洲CCITT推薦)
CRC-32:

接收方將接收到的二進制序列數(包括信息碼和CRC碼)除以多項式,如果余數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這里不再多述。用軟體計算CRC碼時,接收方可以將接收到的信息碼求CRC碼,比較結果和接收到的CRC碼是否相同。

3 按位計算CRC
對於一個二進制序列數可以表示為式(3-1):
(3-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(3-2)所示:
(3-2)
可以設: (3-3)
其中 為整數, 為16位二進制余數。將式(3-3)代入式(3-2)得:

(3-4)
再設: (3-5)
其中 為整數, 為16位二進制余數,將式(3-5)代入式(3-4),如上類推,最後得到:
(3-6)
根據CRC的定義,很顯然,十六位二進制數 既是我們要求的CRC碼。
式(3 -5)是編程計算CRC的關鍵,它說明計算本位後的CRC碼等於上一位CRC碼乘以2後除以多項式,所得的余數再加上本位值除以多項式所得的余數。由此不難理解下面求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,0x1021與多項式有關。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
[code]
按位計算CRC雖然代碼簡單,所佔用的內存比較少,但其最大的缺點就是一位一位地計算會佔用很多的處理器處理時間,尤其在高速通訊的場合,這個缺點更是不可容忍。因此下面再介紹一種按位元組查錶快速計算CRC的方法。
4 按位元組計算CRC
不難理解,對於一個二進制序列數可以按位元組表示為式(4-1),其中 為一個位元組(共8位)。
(4-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(4-2)
可以設: (4-3)
其中 為整數, 為16位二進制余數。將式(4-3)代入式(4-2)得:
(4-4)
因為:
(4-5)
其中 是 的高八位, 是 的低八位。將式(4-5)代入式(4-4),經整理後得:
(4-6)
再設: (4-7)
其中 為整數, 為16位二進制余數。將式(4-7)代入式(4-6),如上類推,最後得:
(4-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(4 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組余式CRC碼的低8位左移8位後,再加上上一位元組CRC右移8位(也既取高8位)和本位元組之和後所求得的CRC碼,如果我們把8位二進制序列數的CRC全部計算出來,放如一個表裡,採用查表法,可以大大提高計算速度。由此不難理解下面按位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二進制數的形式暫存CRC的高8位 */
crc<<=8; /* 左移8位,相當於CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和當前位元組相加後再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
很顯然,按位元組求CRC時,由於採用了查表法,大大提高了計算速度。但對於廣泛運用的8位微處理器,代碼空間有限,對於要求256個CRC余式表(共512位元組的內存)已經顯得捉襟見肘了,但CRC的計算速度又不可以太慢,因此再介紹下面一種按半位元組求CRC的演算法。
5 按半位元組計算CRC
同樣道理,對於一個二進制序列數可以按位元組表示為式(5-1),其中 為半個位元組(共4位)。
(5-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(5-2)
可以設: (5-3)
其中 為整數, 為16位二進制余數。將式(5-3)代入式(5-2)得:
(5-4)
因為:
(5-5)
其中 是 的高4位, 是 的低12位。將式(5-5)代入式(5-4),經整理後得:
(5-6)
再設: (5-7)
其中 為整數, 為16位二進制余數。將式(5-7)代入式(5-6),如上類推,最後得:
(5-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(5 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組CRC碼的低12位左移4位後,再加上上一位元組余式CRC右移4位(也既取高4位)和本位元組之和後所求得的CRC碼,如果我們把4位二進制序列數的CRC全部計算出來,放在一個表裡,採用查表法,每個位元組算兩次(半位元組算一次),可以在速度和內存空間取得均衡。由此不難理解下面按半位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暫存CRC的高四位 */
crc<<=4; /* CRC右移4位,相當於取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本位元組的前半位元組相加後查表計算CRC,
然後加上上一次CRC的余數 */
da=((uchar)(crc/256))/16; /* 暫存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相當於CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本位元組的後半位元組相加後查表計算CRC,
然後再加上上一次CRC的余數 */
ptr++;
}
return(crc);
}
[code]
5 結束語
以上介紹的三種求CRC的程序,按位求法速度較慢,但佔用最小的內存空間;按位元組查表求CRC的方法速度較快,但佔用較大的內存;按半位元組查表求CRC的方法是前兩者的均衡,即不會佔用太多的內存,同時速度又不至於太慢,比較適合8位小內存的單片機的應用場合。以上所給的C程序可以根據各微處理器編譯器的特點作相應的改變,比如把CRC余式表放到程序存儲區內等。[/code]

hjzgq 回復於:2003-05-15 14:12:51
CRC32演算法學習筆記以及如何用java實現 出自:csdn bootcool 2002年10月19日 23:11 CRC32演算法學習筆記以及如何用java實現

CRC32演算法學習筆記以及如何用java實現

一:說明

論壇上關於CRC32校驗演算法的詳細介紹不多。前幾天偶爾看到Ross N. Williams的文章,總算把CRC32演算法的來龍去脈搞清楚了。本來想把原文翻譯出來,但是時間參促,只好把自己的一些學習心得寫出。這樣大家可以更快的了解CRC32的主要思想。由於水平有限,還懇請大家指正。原文可以訪問:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。

二:基本概念及相關介紹

2.1 什麼是CRC

在遠距離數據通信中,為確保高效而無差錯地傳送數據,必須對數據進行校驗即差錯控制。循環冗餘校驗CRC(Cyclic Rendancy Check/Code)是對一個傳送數據塊進行校驗,是一種高效的差錯控制方法。

CRC校驗採用多項式編碼方法。多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,如同邏輯異或運算。

2.2 CRC的運算規則

CRC加法運算規則:0+0=0

0+1=1

1+0=1

1+1=0 (注意:沒有進位)

CRC減法運算規則:

0-0=0

0-1=1

1-0=1

1-1=0

CRC乘法運算規則:

0*0=0

0*1=0

1*0=0

1*1=1

CRC除法運算規則:

1100001010 (注意:我們並不關心商是多少。)

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

10011,.,,....

10011,.,,....

-----,.,,....

00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

-----,....

01011....

00000....

-----....

10110...

10011...

-----...

01010..

00000..

-----..

10100.

10011.

-----.

01110

00000

-----

1110 = 余數

2.3 如何生成CRC校驗碼

(1) 設G(X)為W階,在數據塊末尾添加W個0,使數據塊為M+ W位,則相應的多項式為XrM(X);

(2) 以2為模,用對應於G(X)的位串去除對應於XrM(X)的位串,求得余數位串;

(3) 以2為模,從對應於XrM(X)的位串中減去余數位串,結果就是為數據塊生成的帶足夠校驗信息的CRC校驗碼位串。

2.4 可能我們會問那如何選擇G(x)

可以說選擇G(x)不是一件很容易的事。一般我們都使用已經被大量的數據,時間檢驗過的,正確的,高效的,生成多項式。一般有以下這些:

16 bits: (16,12,5,0) [X25 standard]

(16,15,2,0) ["CRC-16"]

32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]

三: 如何用軟體實現CRC演算法

現在我們主要問題就是如何實現CRC校驗,編碼和解碼。用硬體實現目前是不可能的,我們主要考慮用軟體實現的方法。

以下是對作者的原文的翻譯:

我們假設有一個4 bits的寄存器,通過反復的移位和進行CRC的除法,最終該寄存器中的值就是我們所要求的余數。

3 2 1 0 Bits

+---+---+---+---+

Pop <-- | | | | | <----- Augmented message(已加0擴張的原始數據)

+---+---+---+---+

1 0 1 1 1 = The Poly

(注意: The augmented message is the message followed by W zero bits.)

依據這個模型,我們得到了一個最最簡單的演算法:

把register中的值置0.

把原始的數據後添加r個0.

While (還有剩餘沒有處理的數據)

Begin

把register中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。

If (如果上一步的左移操作中的移出的一位是1)

register = register XOR Poly.

End

現在的register中的值就是我們要求的crc余數。

我的學習筆記:

可為什麼要這樣作呢?我們從下面的實例來說明:

1100001010

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

-》 10011,.,,....

10011,.,,....

-----,.,,....

-》 00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

我們知道G(x)的最高位一定是1,而商1還是商0是由被除數的最高位決定的。而我們並不關心商究竟是多少,我們關心的是余數。例如上例中的G(x)有5 位。我們可以看到每一步作除法運算所得的余數其實就是被除數的最高位後的四位於G(x)的後四位XOR而得到的。那被除數的最高位有什麼用呢?我們從打記號的兩個不同的余數就知道原因了。當被除數的最高位是1時,商1然後把最高位以後的四位於G(x)的後四位XOR得到余數;如果最高位是0,商0然後把被除數的最高位以後的四位於G(x)的後四位XOR得到余數,而我們發現其實這個余數就是原來被除數最高位以後的四位的值。也就是說如果最高位是0就不需要作XOR的運算了。到這我們總算知道了為什麼先前要這樣建立模型,而演算法的原理也就清楚了。

以下是對作者的原文的翻譯:

可是這樣實現的演算法卻是非常的低效。為了加快它的速度,我們使它一次能處理大於4 bit的數據。也就是我們想要實現的32 bit的CRC校驗。我們還是假設有和原來一樣的一個4 "bit"的register。不過它的每一位是一個8 bit的位元組。

3 2 1 0 Bytes

+----+----+----+----+

Pop <-- | | | | | <----- Augmented message

+----+----+----+----+

1<------32 bits------> (暗含了一個最高位的「1」)

根據同樣的原理我們可以得到如下的演算法:

While (還有剩餘沒有處理的數據)

Begin

檢查register頭位元組,並取得它的值

求不同偏移處多項式的和

register左移一個位元組,最右處存入新讀入的一個位元組

把register的值和多項式的和進行XOR運算

End

我的學習筆記:

可是為什麼要這樣作呢? 同樣我們還是以一個簡單的例子說明問題:

假設有這樣的一些值:

當前register中的值: 01001101

4 bit應該被移出的值:1011

生成多項式為: 101011100

Top Register

---- --------

1011 01001101

1010 11100 + (CRC XOR)

-------------

0001 10101101

首4 bits 不為0說明沒有除盡,要繼續除:

0001 10101101

1 01011100 + (CRC XOR)

-------------

0000 11110001

^^^^

首4 bits 全0說明不用繼續除了。

那按照演算法的意思作又會有什麼樣的結果呢?

1010 11100

1 01011100+

-------------

1011 10111100

1011 10111100

1011 01001101+

-------------

0000 11110001

現在我們看到了這樣一個事實,那就是這樣作的結果和上面的結果是一致的。這也說明了演算法中為什麼要先把多項式的值按不同的偏移值求和,然後在和 register進行異或運算的原因了。另外我們也可以看到,每一個頭位元組對應一個值。比如上例中:1011,對應01001101。那麼對於 32 bits 的CRC 頭位元組,依據我們的模型。頭8 bit就該有 2^8個,即有256個值與它對應。於是我們可以預先建立一個表然後,編碼時只要取出輸入數據的頭一個位元組然後從表中查找對應的值即可。這樣就可以大大提高編碼的速度了。

+----+----+----+----+

+-----< | | | | | <----- Augmented message

| +----+----+----+----+

| ^

| |

| XOR

| |

| 0+----+----+----+----+

v +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

+-----> +----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

255+----+----+----+----+

以下是對作者的原文的翻譯:

上面的演算法可以進一步優化為:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組作為下標定位 table 中的一個32位的值

3:把這個值XOR到register中。

4:如果還有未處理的數據則回到第一步繼續執行。

用C可以寫成這樣:

r=0;

while (len--)
r = ((r << | p*++) ^ t[(r >> 24) & 0xFF];

可是這一演算法是針對已經用0擴展了的原始數據而言的。所以最後還要加入這樣的一個循環,把W個0加入原始數據。

我的學習筆記:

注意不是在預處理時先加入W個0,而是在上面演算法描述的循環後加入這樣的處理。

for (i=0; i<W/4; i++)
r = (r << ^ t[(r >> 24) & 0xFF];
所以是W/4是因為若有W個0,因為我們以位元組(8位)為單位的,所以是W/4個0 位元組。注意不是循環w/8次
以下是對作者的原文的翻譯:
1:對於尾部的w/4個0位元組,事實上它們的作用只是確保所有的原始數據都已被送入register,並且被演算法處理。
2:如果register中的初始值是0,那麼開始的4次循環,作用只是把原始數據的頭4個位元組送入寄存器。(這要結合table表的生成來看)。就算 register的初始值不是0,開始的4次循環也只是把原始數據的頭4個位元組把它們和register的一些常量XOR,然後送入register中。

3A xor B) xor C = A xor (B xor C)

總上所述,原來的演算法可以改為:

+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+

演算法:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組和讀入的新位元組XOR從而產生定位下標,從table中取得相應的值。

3:把該值XOR到register中

4:如果還有未處理的數據則回到第一步繼續執行。

我的學習筆記:

對這一演算法我還是不太清楚,或許和XOR的性質有關,懇請大家指出為什麼?

謝謝。

到這,我們對CRC32的演算法原理和思想已經基本搞清了。下章,我想著重根據演算法思想用java語言實現。

hjzgq 回復於:2003-05-15 14:14:51
數學演算法一向都是密碼加密的核心,但在一般的軟路加密中,它似乎並不太為人們所關心,因為大多數時候軟體加密本身實現的都是一種編程上的技巧。但近幾年來隨著序列號加密程序的普及,數學演算法在軟體加密中的比重似乎是越來越大了。

我們先來看看在網路上大行其道的序列號加密的工作原理。當用戶從網路上下載某個Shareware -- 共享軟體後,一般都有使用時間上的限制,當過了共享軟體的試用期後,你必須到這個軟體的公司去注冊後方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟體公司,軟體公司會根據用戶的信息計算出一個序列碼出來,在用戶得到這個序列碼後,按照注冊需要的步驟在軟體中輸入注冊信息和注冊碼,其注冊信息的合法性由軟體驗證通過後,軟體就會取消掉本身的各種限制。這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在網上的軟體80%都是以這種方式來保護的。

我們可以注意到軟體驗證序列號的合法性過程,其實就是驗證用戶名與序列號之間的換算關系是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼相比較,公式表示如下:

序列號 = F(用戶名稱)

⑻ hash演算法的有哪幾種,優缺點,使用場景

Hash演算法在信息安全方面的應用主要體現在以下的3個方面: 1)文件校驗 我們比較熟悉的校驗演算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗數據篡改的能力,它們一定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。

閱讀全文

與校驗演算法的缺點是相關的資料

熱點內容
移動端微信商城源碼 瀏覽:438
編程貓下一個背景在哪裡 瀏覽:352
javaclasstype 瀏覽:232
樂高編程和樂高課的延伸 瀏覽:350
蘋果手機怎麼切換app美國賬號 瀏覽:861
編譯程序輸入一個字元串 瀏覽:407
圓命令畫法 瀏覽:308
如果給電腦e盤文件加密 瀏覽:801
javaswing項目 瀏覽:778
androidsdksetup 瀏覽:1005
pdf怎麼設置中文 瀏覽:128
安卓手機用什麼軟體看倫敦金 瀏覽:966
魅族文件夾無名稱 瀏覽:792
蘇黎世無人機演算法 瀏覽:876
核桃編程和小碼王的融資 瀏覽:686
微積分教材pdf 瀏覽:727
寫python給微信好友發消息 瀏覽:338
蚊帳自營米加密 瀏覽:422
學校推薦核桃編程 瀏覽:805
湖南農信app怎麼導明細 瀏覽:475