6 个稳定版本
1.1.0 | 2021 年 4 月 11 日 |
---|---|
1.0.4 | 2021 年 4 月 10 日 |
#2009 in 算法
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
的优化实现,使用avx2
或ssse3
指令
在运行时调用 Adler32::new
或 Adler32::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(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,没有任何附加条款或条件。