使用方法
- 輸入或貼上文字;把輸入格式切換為十六進位可以輸入原始位元組,也可以開啟檔案計算其內容的校驗和。
- ZIP、gzip 和 PNG 使用預設的 CRC-32;iSCSI、ext4、Btrfs 和 Google Cloud Storage 請選擇 CRC-32C。
- 選擇輸出格式:小寫十六進位、大寫十六進位、十進位或 Base64。
- 如需校驗,把預期的校驗和貼上到「對比」框中,可以是十六進位(不帶 0x)、十進位或 Base64。
什麼是 CRC32 校驗和
迴圈冗餘校驗(CRC)把輸入看作一個很長的二進位多項式,用固定的生成多項式去除,並保留餘數。CRC-32 的餘數為 32 位,通常寫成 8 個十六進位數字,或 0 到 4294967295 之間的無符號整數。對資料的幾乎任何改動都會改變餘數。
CRC 專門針對線纜、無線通道和磁碟中真實出現的錯誤而設計。CRC-32 能檢測出所有長度不超過 32 位的突發錯誤,隨機損壞未被發現的機率只有約 43 億分之一。它的計算速度也非常快,因此被內建在 ZIP、gzip、PNG 和乙太網路幀中。
CRC-32 與 CRC-32C
| CRC-32 | CRC-32C(Castagnoli) | |
|---|---|---|
| 生成多項式 | 0x04C11DB7,反射形式 0xEDB88320 | 0x1EDC6F41,反射形式 0x82F63B78 |
123456789 的校驗值 | cbf43926 | e3069283 |
| 使用場景 | ZIP、gzip、PNG、乙太網路 | iSCSI、SCTP、ext4 後設資料、Btrfs、Google Cloud Storage |
| 硬體支援 | ARMv8 CRC32 指令 | x86 SSE4.2 的 crc32 指令、ARMv8 |
兩者的初始值都是 0xFFFFFFFF,都按每個位元組的最低位優先處理,並在最後取反,區別只在生成多項式,所以同一份資料會得到兩個毫不相關的結果。前者就是大多數工具所說的「CRC32」,在 CRC 參數目錄中稱為 CRC-32/ISO-HDLC;CRC-32C 出現得更晚,因檢錯能力更強而被儲存和網路協議採用。Google Cloud Storage 提供 CRC-32C,Amazon S3 兩種都支援,它們都把校驗和表示為 4 個位元組按大端序排列後的 Base64,與本工具的 Base64 輸出完全一致。
校驗和不等於安全校驗
CRC 防的是意外,而不是攻擊。它是線性函式,任何人都可以在修改檔案後再調整其中 4 個位元組,讓 CRC-32 保持不變。因此,CRC 一致並不能排除有人故意篡改。校驗下載檔案時,應與可信來源提供的 SHA-256 雜湊進行比較;需要證明訊息由誰發出時,請使用 HMAC。
32 位用來標識資料也太短了。在大約 7.7 萬個隨機檔案中,出現兩個檔案 CRC-32 相同的機率就已經達到 50%,所以不要把它當作唯一 ID 或去重依據。在不涉及攻擊者的場景下,MD5 或 SHA-256 是好得多的資料指紋。
在程式碼中計算 CRC32
# Python:Python 3 中 zlib.crc32 返回無符號整數,
# 只有相容 Python 2 時才需要 "& 0xffffffff"
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ 和 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0') // 'cbf43926'
// Go (import "hash/crc32")
crc32.ChecksumIEEE(data) // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli)) // CRC-32C
// Java:java.util.zip.CRC32,Java 9 起還有 java.util.zip.CRC32C
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926',同樣是 CRC-32
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc',另一種 CRC
PHP 中要注意名稱:名為 crc32 的雜湊演算法並不是 ZIP 使用的校驗和,而是 bzip2 使用的 CRC,並且按相反的位元組順序輸出。要與 ZIP、gzip 和本工具的結果一致,請使用 crc32b 或 crc32() 函式。Unix 的 cksum 命令又是另一種變體,還會把檔案長度計算在內,所以結果同樣對不上。
編碼範例
| 輸入 (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
常見問題
「123456789」 的 CRC32 是多少?
cbf43926(十進位 3421780262),CRC-32C 為 e3069283。如果你自己的實現得到這兩個值,說明參數與本工具一致。為什麼我的 CRC32 與其他工具算出的不一樣?
cksum 的結果各不相同);輸入位元組(換行符、末尾多餘的換行、文字編碼);數字格式(有些語言返回有符號 32 位整數,較大的值會變成負數);以及位元組順序。為什麼 ZIP 或 gzip 檔案裡的 CRC 位元組是反的?
unzip -v 以及大多數程式都把最高位位元組寫在最前面。可以計算大檔案的 CRC32 嗎?
可以。點選「開啟檔案」,校驗和會在你的裝置上根據檔案位元組計算,檔案不會上傳;只要瀏覽器能把檔案載入記憶體即可。之後可以與 SFV 校驗檔案或 ZIP 列表中的值進行比較。
CRC32 算雜湊函式嗎?
它能把任意長度的資料對映為固定的 32 位值,所以常與雜湊函式放在一起,但它本質上是校驗和:只能發現意外錯誤,無法防範有人故意修改資料。如果需要更可靠的資料指紋,結果下方的「全部演算法」表格會同時列出同一輸入的 MD5 和 SHA 系列雜湊。