CRC32 校驗和計算器

計算文字、十六進位位元組或整個檔案的 CRC-32 或 CRC-32C 校驗和,以十六進位、十進位或 Base64 顯示,並可與預期值對比。檔案只在本地讀取,不會上傳。

全部演算法

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 輸入或貼上文字;把輸入格式切換為十六進位可以輸入原始位元組,也可以開啟檔案計算其內容的校驗和。
  2. ZIP、gzip 和 PNG 使用預設的 CRC-32;iSCSI、ext4、Btrfs 和 Google Cloud Storage 請選擇 CRC-32C。
  3. 選擇輸出格式:小寫十六進位、大寫十六進位、十進位或 Base64。
  4. 如需校驗,把預期的校驗和貼上到「對比」框中,可以是十六進位(不帶 0x)、十進位或 Base64。

什麼是 CRC32 校驗和

迴圈冗餘校驗(CRC)把輸入看作一個很長的二進位多項式,用固定的生成多項式去除,並保留餘數。CRC-32 的餘數為 32 位,通常寫成 8 個十六進位數字,或 0 到 4294967295 之間的無符號整數。對資料的幾乎任何改動都會改變餘數。

CRC 專門針對線纜、無線通道和磁碟中真實出現的錯誤而設計。CRC-32 能檢測出所有長度不超過 32 位的突發錯誤,隨機損壞未被發現的機率只有約 43 億分之一。它的計算速度也非常快,因此被內建在 ZIP、gzip、PNG 和乙太網路幀中。

CRC-32 與 CRC-32C

CRC-32CRC-32C(Castagnoli)
生成多項式0x04C11DB7,反射形式 0xEDB883200x1EDC6F41,反射形式 0x82F63B78
123456789 的校驗值cbf43926e3069283
使用場景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.is915d7207
你好50a2b841

常見問題

「123456789」 的 CRC32 是多少?
這個字串是 CRC 演算法的標準測試輸入。它的 CRC-32 為 cbf43926(十進位 3421780262),CRC-32C 為 e3069283。如果你自己的實現得到這兩個值,說明參數與本工具一致。
為什麼我的 CRC32 與其他工具算出的不一樣?
請檢查四點:變體(CRC-32、CRC-32C、bzip2 的 CRC 和 POSIX cksum 的結果各不相同);輸入位元組(換行符、末尾多餘的換行、文字編碼);數字格式(有些語言返回有符號 32 位整數,較大的值會變成負數);以及位元組順序。
為什麼 ZIP 或 gzip 檔案裡的 CRC 位元組是反的?
ZIP 和 gzip 以小端序儲存 CRC-32,所以在十六進位編輯器中看到的 4 個位元組與通常寫法順序相反。PNG 則以大端序儲存。本工具、unzip -v 以及大多數程式都把最高位位元組寫在最前面。
可以計算大檔案的 CRC32 嗎?

可以。點選「開啟檔案」,校驗和會在你的裝置上根據檔案位元組計算,檔案不會上傳;只要瀏覽器能把檔案載入記憶體即可。之後可以與 SFV 校驗檔案或 ZIP 列表中的值進行比較。

CRC32 算雜湊函式嗎?

它能把任意長度的資料對映為固定的 32 位值,所以常與雜湊函式放在一起,但它本質上是校驗和:只能發現意外錯誤,無法防範有人故意修改資料。如果需要更可靠的資料指紋,結果下方的「全部演算法」表格會同時列出同一輸入的 MD5 和 SHA 系列雜湊。