Kết nối qua MCP →

Nhập phép tính

Công thức

Quảng cáo

Kết quả

CRC Checksum (hex)
0x29B1
16-bit checksum
Giá trị thập phân 10.673
Độ rộng bit 16 bits
Số byte đã xử lý 9

CRC checksum là gì?

CRC (Cyclic Redundancy Check — kiểm tra dư vòng) là một mã phát hiện lỗi được dùng rộng rãi trong mạng máy tính, lưu trữ dữ liệu và nhiều định dạng tệp (Ethernet, ZIP, PNG, Modbus, USB và nhiều chuẩn khác). Nó coi dữ liệu của bạn như một số nhị phân rất dài rồi đem chia cho một đa thức sinh cố định bằng phép tính nhị phân không nhớ (trên trường GF(2), nơi phép cộng và phép trừ đều chính là phép XOR). Phần dư của phép chia đó chính là giá trị CRC. Chỉ cần một bit duy nhất trong thông điệp thay đổi, phần dư gần như chắc chắn cũng thay đổi theo — đây chính là lý do CRC cực kỳ hiệu quả trong việc phát hiện lỗi truyền và lỗi lưu trữ.

Sơ đồ khối của một thông điệp được chia thành dữ liệu cộng với trường tổng kiểm CRC được thêm vào
CRC thêm một giá trị kiểm tra ngắn vào dữ liệu để có thể phát hiện lỗi.

Cách dùng công cụ này

Bạn chỉ cần gõ một đoạn văn bản ASCII bất kỳ vào ô nhập, chọn biến thể CRC cần dùng và xem kết quả. Công cụ trả về giá trị checksum ở cả hệ thập lục phân (hex) lẫn hệ thập phân, kèm theo độ rộng bit và số byte đã xử lý. Hiện công cụ hỗ trợ ba biến thể phổ biến:

CRC-8 — đa thức \(\mathtt{0x07}\), giá trị khởi tạo \(\mathtt{0x00}\).
CRC-16/CCITT-FALSE — đa thức \(\mathtt{0x1021}\), giá trị khởi tạo \(\mathtt{0xFFFF}\), không đảo bit.
CRC-32 (IEEE 802.3) — đa thức đảo \(\mathtt{0xEDB88320}\), khởi tạo \(\mathtt{0xFFFFFFFF}\), XOR cuối \(\mathtt{0xFFFFFFFF}\). Đây chính là biến thể được ZIP, gzip và Ethernet sử dụng.

Giải thích công thức

Về mặt lý thuyết, thông điệp \(M(x)\) được nhân với \(x^n\) (trong đó \(n\) là bậc của đa thức sinh) rồi chia cho \(G(x)\). Trên thực tế, ta dùng một thanh ghi và dịch nó từng bit một, thực hiện phép XOR với đa thức mỗi khi bit dẫn đầu bằng 1. Các biến thể đảo bit (như CRC-32) xử lý bit theo thứ tự bit ít quan trọng nhất trước và dịch sang phải thay vì sang trái.

$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b)$$

$$\text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$

Phép chia đa thức dài các bit thông điệp cho đa thức sinh trên GF(2) bằng các bước XOR
CRC là phần dư của phép chia đa thức nhị phân (XOR) thông điệp cho đa thức sinh \(G(x)\).

Ví dụ minh họa

Với chuỗi kiểm tra kinh điển 123456789: CRC-16/CCITT-FALSE cho kết quả 0x29B1 (thập phân \(10673\)), còn CRC-32/IEEE cho kết quả 0xCBF43926 (thập phân \(3421780262\)). Đây là những giá trị "check" tiêu chuẩn được công bố trong các danh mục tham chiếu CRC, nên bạn có thể dùng chúng để đối chiếu và kiểm chứng bất kỳ cách triển khai nào.

Câu hỏi thường gặp

Vì sao kết quả của tôi khác với công cụ khác? Các biến thể CRC khác nhau ở đa thức, giá trị khởi tạo, cách đảo bit và phép XOR cuối. Hãy chắc chắn rằng bạn đang so sánh đúng cùng một biến thể.

CRC có phải là một hàm băm bảo mật không? Không. CRC chỉ phát hiện lỗi ngẫu nhiên, nhưng cực kỳ dễ bị làm giả một cách có chủ đích. Để bảo mật, hãy dùng SHA-256 hoặc các hàm tương đương.

Công cụ dùng bảng mã gì? Mỗi ký tự được lấy theo giá trị byte 8 bit ASCII/Latin-1 của nó trước khi tính CRC.

Cập nhật lần cuối: