22个版本 (稳定)
| 3.2.1 | 2024年4月8日 |
|---|---|
| 3.1.0 |
|
| 3.1.0-beta.1 |
|
| 3.0.1 | 2023年1月28日 |
| 0.2.0 | 2015年3月17日 |
#4 in 算法
2,191,862 每月下载量
在 1,685 个crate中(直接使用343个) 使用
76KB
2K SLoC
crc
CRC的Rust实现。
用法
将 crc 添加到 Cargo.toml
[dependencies]
crc = "3.2.1"
示例
使用知名算法
const X25: crc::Crc<u16> = crc::Crc::<u16>::new(&crc::CRC_16_IBM_SDLC);
assert_eq!(X25.checksum(b"123456789"), 0x906e);
使用自定义算法
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);
最小支持的Rust版本 (MSRV)
该crate的MSRV是1.65。
至少,MSRV将是过去12个月中最古老的稳定版本的 <=。MSRV可能在次要版本发布时提升。
实现
该crate有多个可插拔的实现
NoTable不使用查找表,因此最小化了二进制大小和内存使用。Table<1>使用具有256个条目的查找表(例如,对于u32,那是256 * 4字节)。Table<16>使用具有16 * 256个条目的查找表(例如,对于u32,那是16 * 256 * 4字节)。
Table<1> 是默认实现,但可以通过在 Crc<W, I> 中指定 I 来覆盖。例如:Crc<u32, NoTable>,Crc<u64, Table<16>>,...
注意:如果编译时生成查找表,则查找表将增加二进制大小。如果二进制大小是一个问题,则将 Crc 初始化包装在 std::cell::OnceCell 中可能更可取。
基准测试
cargo bench 在 AMD Ryzen 7 3800X 上进行测试(比较)。
吞吐量(GiB/s)
| 宽度 | 无表格 | 字节级 | 切片16 |
|---|---|---|---|
| 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 |
许可证
许可方式为以下之一
- Apache License,版本 2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT License(《LICENSE-MIT》或https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
除非你明确表示,否则根据 Apache-2.0 许可证定义的,你有意提交以包含在作品中的任何贡献,将如上双许可,不附加任何额外条款或条件。
依赖项
约 26KB