What CRC-32C is
CRC-32C is a 32-bit cyclic redundancy check based on the Castagnoli polynomial, chosen for storage and network protocols because it has strong error-detection properties and can be computed in hardware.
How it works
The CRC register is initialised to 0xFFFFFFFF. Each input byte is XORed into the low byte of the register, then the register is shifted right eight times; each time a 1 bit is shifted out, the reflected polynomial 0x82F63B78 (the bit-reversal of 0x1EDC6F41) is XORed back in. After the final byte, the register is XORed with 0xFFFFFFFF to produce the result. Because both input and output are reflected, the whole computation runs least-significant-bit first.
This calculator precomputes a 256-entry table from the polynomial and folds one byte at a time through it — the same byte-slicing approach the Linux kernel and Intel’s CRC libraries use.
Why Castagnoli instead of the original CRC-32 polynomial?
When engineers designed iSCSI and SCTP in the early 2000s, they evaluated dozens of polynomials against theoretical error-detection benchmarks. The Castagnoli polynomial (0x1EDC6F41) was found to offer better Hamming distance properties than the original CRC-32 (0x04C11DB7) for most packet sizes used in storage and networking. Better Hamming distance means more error patterns are caught — specifically, it can detect all burst errors of up to 32 bits, all odd numbers of errors, and all two-bit errors up to a larger data length than the original polynomial.
The practical tipping point came when Intel added a dedicated CRC32 instruction to SSE 4.2 (circa 2008) that computes the Castagnoli variant in hardware. A single instruction processing one byte takes one clock cycle; with unrolled loops slicing eight bytes at a time, a modern CPU can checksum data at multi-gigabit throughput. This is why CRC-32C became the natural choice for NVMe, storage drivers, and high-speed network stacks.
Where CRC-32C is used
- iSCSI (RFC 3720) — mandatory integrity check on the protocol data unit header and optionally on the data digest.
- SCTP (RFC 4960) — replaces the earlier weaker checksum that was based on the Adler-32/CRC-32 family; CRC-32C is mandatory.
- ext4 — filesystem journal and block group checksums.
- Btrfs — per-block checksums for data and metadata.
- RocksDB and LevelDB — SSTable block checksums.
- Google Cloud Spanner and Cloud Storage — used to verify data integrity in transit.
CRC-32C vs. CRC-32 — quick comparison
| Property | CRC-32 (zlib) | CRC-32C (Castagnoli) |
|---|---|---|
| Polynomial | 0x04C11DB7 | 0x1EDC6F41 |
| Check value (123456789) | 0xCBF43926 | 0xE3069283 |
| Hardware instruction | No dedicated one | SSE 4.2 CRC32 |
| Primary use | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, ext4, Btrfs |
Example and notes
The standard test vector 123456789 yields 0xE3069283; matching this value is the quickest way to confirm a CRC-32C implementation. Switch to Hex bytes to checksum binary data such as a disk block or a network segment payload.
Do not confuse CRC-32C with the more common CRC-32 used by zlib, gzip, and PNG — they share the name “CRC-32” but use different polynomials and will never agree on the same input. CRC-32C protects only against accidental corruption and is not a security primitive. Everything is computed locally in your browser.