#crc32 #hash #crc64 #crc16

no-std crc

Rust实现的CRC,支持多种标准

22个版本 (稳定)

3.2.1 2024年4月8日
3.1.0 2024年3月1日
3.1.0-beta.1 2023年10月31日
3.0.1 2023年1月28日
0.2.0 2015年3月17日

#4 in 算法

Download history 422657/week @ 2024-04-29 422826/week @ 2024-05-06 468717/week @ 2024-05-13 451858/week @ 2024-05-20 449973/week @ 2024-05-27 486685/week @ 2024-06-03 477706/week @ 2024-06-10 462479/week @ 2024-06-17 462316/week @ 2024-06-24 472027/week @ 2024-07-01 513086/week @ 2024-07-08 510976/week @ 2024-07-15 546728/week @ 2024-07-22 530152/week @ 2024-07-29 546652/week @ 2024-08-05 547038/week @ 2024-08-12

2,191,862 每月下载量
1,685 个crate中(直接使用343个) 使用

MIT/Apache

76KB
2K SLoC

crc

CRC的Rust实现。

ci Crate Docs License

用法

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有多个可插拔的实现

  1. NoTable 不使用查找表,因此最小化了二进制大小和内存使用。
  2. Table<1> 使用具有256个条目的查找表(例如,对于u32,那是256 * 4字节)。
  3. 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-2.0 许可证定义的,你有意提交以包含在作品中的任何贡献,将如上双许可,不附加任何额外条款或条件。

依赖项

约 26KB