#crc32 #checksum #simd #crc #performance

no-std crc32fast

快速、SIMD加速的CRC32(IEEE)校验和计算

16个稳定版本

使用旧的Rust 2015

1.4.2 2024年5月20日
1.4.0 2024年2月12日
1.3.2 2022年2月8日
1.3.0 2021年11月30日
1.0.4 2018年11月30日

#1 in 硬件支持

Download history 1502640/week @ 2024-05-03 1555116/week @ 2024-05-10 1652888/week @ 2024-05-17 1703551/week @ 2024-05-24 1875568/week @ 2024-05-31 1846520/week @ 2024-06-07 1781782/week @ 2024-06-14 1800750/week @ 2024-06-21 1686596/week @ 2024-06-28 1796386/week @ 2024-07-05 1841022/week @ 2024-07-12 1853017/week @ 2024-07-19 1841562/week @ 2024-07-26 1806152/week @ 2024-08-02 1972018/week @ 2024-08-09 1548749/week @ 2024-08-16

7,510,218 每月下载量
14,209 个Crates中使用(直接使用288个)

MIT/Apache

84KB
1K SLoC

crc32fast 构建状态 Crates.io 文档

快速、SIMD加速的CRC32(IEEE)校验和计算

使用方法

简单使用

对于简单用例,您可以直接调用hash便捷函数来计算给定字节的CRC32校验和

let checksum = crc32fast::hash(b"foo bar baz");

高级使用

对于需要更多灵活性和性能的用例,例如处理大量数据时,您可以创建并操作一个Hasher

use crc32fast::Hasher;

let mut hasher = Hasher::new();
hasher.update(b"foo bar baz");
let checksum = hasher.finalize();

性能

该crate包含多个CRC32实现

  • 一个快速的基准实现,每次迭代处理多达16个字节
  • 一个针对现代x86优化的实现,使用ssepclmulqdq指令
  • 一个针对aarch64优化的实现,使用crc32指令

在运行时调用Hasher::new构造函数将执行功能检测,以选择最适合当前CPU功能集的最优实现。

crate 版本 变体 ns/iter MB/s
crc 1.8.1 n/a 4,926 207
crc32fast(此crate) 1.0.0 基准 683 1499
crc32fast(此crate) 1.0.0 pclmulqdq 140 7314

内存安全

由于优化实现中使用了SIMD内联函数,该crate包含一些unsafe代码。

为确保内存安全,相关代码已经使用afl.rs进行了模糊测试,在debugrelease构建配置下进行了数百万次迭代。您可以在fuzz子目录中检查测试设置,其中还包含了如何自行运行测试的说明。

此外,每个提交都通过CI中的地址清理器进行测试,以捕获任何越界内存访问。

尽管模糊测试和清理都没有发现任何安全漏洞,但如果您遇到任何崩溃或其他意外行为,请不要犹豫,提交问题。

可用功能标志

std(默认:启用)

此库支持在不使用Rust std库的情况下进行构建,这对于没有操作系统的嵌入式等低级用例非常有用。要在no_std环境中构建crate,请禁用默认的std功能。

注意:由于运行时CPU功能检测需要操作系统支持,当禁用std功能时,专门的SIMD实现将不可用。

nightly(默认:禁用)

此功能标志启用了仅在nightly频道上可用的不稳定功能。请注意,当启用此功能标志时,在更新编译器版本时可能会遇到破坏性更改。

目前,启用此功能标志将使优化的aarch64实现可用。

许可证

本项目受以下任一许可证的许可:

任选其一。

贡献

除非您明确声明,否则您提交的任何有意包含在本项目中的贡献,根据Apache-2.0许可证定义,应如上所述双重许可,不附加任何额外条款或条件。

依赖项