演算法實現/校驗和
外觀
< 演算法實現
有些人將校驗和視為一種雜湊,但碰撞(不同的輸入,相同的結果)的可能性很大。校驗和用於檢測不可恢復的錯誤,以防止系統中進一步的資料損壞。如果需要校正,則需要ECC(糾錯碼,例如漢明碼、裡德-所羅門碼或BCH碼)。
碰撞率是大小和計算速度之間的折衷。n位校驗和檢測失敗的機率是2^-n。此大小的選擇取決於應用程式的要求和預期的錯誤模型(錯誤的型別和機率)。16位校驗和欄位很小,但每65536個隨機輸入就會出現一個誤報(充其量),因此它用於資料塊較小、後果良性且/或損壞不太可能的情況。32位校驗和的開銷是其大小的兩倍,但碰撞的機率只有40億分之一,因此它常用於儲存或傳輸大型檔案,如果這些檔案可能會被修改。
編寫校驗和演算法的程式設計師可以使用反碼加法,如果願意為了非常高的速度而犧牲錯誤檢測的有效性(例如EXE檔案或IP報頭資料包),可以使用Fletcher-32校驗和來平衡速度和錯誤檢測(儘管它無法區分0xFFFF和0x0000),可以使用CRC-32來獲得更好的錯誤檢測,但在需要效能時實現更復雜。[1]程式設計師應該使用MAC或數字簽名——通常涉及加密安全的雜湊,例如SHA-256或SHA-3——如果願意執行速度更慢並分配256位或更多以檢測對資料的惡意更改。此類雜湊在後面的章節中介紹,雜湊。
- PEAC(帶進位的皮薩諾演算法)與Fletcher和Adler校驗和一樣快,並且具有更好的錯誤檢測能力(幾乎與CRC一樣好)[2],方法是在皮薩諾(截斷斐波那契)結構中使用反碼加法(也稱為進位)。一對16位暫存器可以生成與CRC32相當的校驗和,並且編碼複雜度要低得多。對於僅16位的校驗和,可以將兩個16位暫存器相加。
- Verhoeff演算法
- Damm演算法
- CRC16 CCITT
- CRC16 XModem
- CRC32 / FCS32 - 通常用於乙太網和與PKZip相容的歸檔
- ↑ Theresa C. Maxino。"嵌入式網路校驗和的有效性"比較了常用校驗和的錯誤檢測有效性:異或(XOR)、二進位制補碼加法、一進位制補碼加法、Fletcher校驗和、Adler校驗和和迴圈冗餘碼(CRC)…簡要提到“加權和碼”在錯誤檢測方面可能與CRC一樣好,但計算成本更低…討論了關於錯誤檢查碼的常見誤解。
- ↑ Yann Guidon / YGDES。"PEAC 帶進位的皮薩諾演算法"。