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》或http://www.apache.org/licenses/LICENSE-2.0)
- MIT License(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确表示,否则根据 Apache-2.0 许可证定义的,你有意提交以包含在作品中的任何贡献,将如上双许可,不附加任何额外条款或条件。
依赖项
约 26KB