#adler32 #checksum #simd #performance #adler

no-std adler32fast

快速、SIMD 加速的 Adler-32 校验和计算

6 个稳定版本

1.1.0 2021 年 4 月 11 日
1.0.4 2021 年 4 月 10 日

#2009 in 算法

MIT/Apache

27KB
558

adler32fast

快速、SIMD 加速的 Adler-32 校验和计算

使用方法

use adler32fast::Adler32;

let mut adler32 = Adler32::new();
adler32.update(b"foo bar baz");
let checksum = adler32.as_u32();

性能

本包包含多个 Adler-32 实现

  • 一个快速的基线实现,每次迭代处理多达 16 字节
  • 针对现代 x86/x86_64 的优化实现,使用 avx2ssse3 指令

在运行时调用 Adler32::newAdler32::from 构造函数将执行功能检测,以选择当前 CPU 功能集中最优的实现。

以下测试在 Razer Book 13 RZ09-0357,i7-1165G7 @ 2.80 GHz,100kb 数据的情况下进行。

crate 版本 变体 us/iter GiB/s
adler32 1.2.0 n/a 23.50 3.96
adler32fast (本包) 1.1.0 基线 22.69 4.10
adler32fast (本包) 1.1.0 ssse3 3.09 30.17
adler32fast (本包) 1.1.0 avx2 2.36 39.43

可以使用 criterion 在稳定 Rust 上运行基准测试,命令为 cargo bench

欢迎为更多 SIMD 变体做出贡献!

内存安全

由于优化实现使用了 SIMD 内置函数,因此本包包含一些 unsafe 代码。

adler32fast 使用 cargo-fuzz 进行模糊测试。(注意:cargo-fuzz 在 Windows 上不工作,但可以在 WSL 下运行。

cargo-fuzz 目前需要 nightly 工具链。

$ cargo install cargo-fuzz
$ rustup toolchain install nightly

$ cargo +nightly fuzz run ssse3

致谢

本工作以 crc32fast 为灵感。

AVX2 实现源自 simd-adler32

SSSE3 实现源自 Google 的 Wuffs 实现。

许可证

以下任一许可证下授权:

由您选择。

贡献

除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,没有任何附加条款或条件。

依赖项