Rust implementation of CRC.
Add crc
to Cargo.toml
[dependencies]
crc = "3.0"
Using a well-known algorithm:
const X25: crc::Crc<u16> = crc::Crc::<u16>::new(&crc::CRC_16_IBM_SDLC);
assert_eq!(X25.checksum(b"123456789"), 0x906e);
Using a custom algorithm:
const CUSTOM_ALG: crc::Algorithm<u16> = crc::Algorithm {
width: 16,
poly: 0x8005,
init: 0xffff,
refin: false,
refout: false,
xorout: 0x0000,
check: 0xaee7,
residue: 0x0000
};
let crc = crc::Crc::<u16>::new(&CUSTOM_ALG);
let mut digest = crc.digest();
digest.update(b"123456789");
assert_eq!(digest.finalize(), 0xaee7);
This crate's MSRV is 1.56.
At a minimum, the MSRV will be <= the oldest stable release in the last 12 months. MSRV may be bumped in minor version releases.
This crate offers three flavors of lookup tables providing a tradeoff between computation speed and used memory. See the benchmark section for hints, but do benchmarks on your target hardware to decide if the tradeoff is worth it to you.
NoTable
provides an implementation that uses no additional memoryBytewise
provides an implementation that uses a lookup table that uses 256 entries of the used width (e.g. for u32 thats 256 * 4 bytes)Slice16
provides an implementation that uses a lookup table that uses 16 * 256 entries of the used width (e.g. for u32 thats 16 * 256 * 4 bytes)These can be used by substituting Crc<uxxx>
with e.g. Crc<Slice16<uxxx>>
. The flavor for Crc<uxxx>
is chosen based on three crate features:
If no feature is selected, the Bytewise
flavor is used.
Note that these tables can bloat your binary size if you precalculate them at compiletime (this happens in Crc::new
). Choosing a crate like oncecell or lazystatic to compute them once at runtime may be preferable where binary size is a concern.
cargo bench
with AMD Ryzen 7 3800X (comparison).
Width | NoTable | Bytewise | Slice16 |
---|---|---|---|
8 | 0.113 | 0.585 | 3.11 |
16 | 0.105 | 0.483 | 3.23 |
32 | 0.111 | 0.516 | 3.30 |
64 | 0.139 | 0.517 | 2.92 |
82 | 0.091 | 0.438 | 0.623 |
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Author: mrhooray
Source: https://github.com/mrhooray/crc-rs
License: Apache-2.0, MIT licenses found