#adler32 #simd #avx2 #adler #ssse3

no-std simd-adler32

一个SIMD加速的Adler-32哈希算法实现

9次发布

0.3.7 2023年7月24日
0.3.6 2023年7月24日
0.3.5 2023年3月13日
0.3.4 2021年10月12日
0.1.0 2021年4月9日

#65 in 算法

Download history 312814/week @ 2024-04-23 321192/week @ 2024-04-30 311981/week @ 2024-05-07 333031/week @ 2024-05-14 344903/week @ 2024-05-21 448208/week @ 2024-05-28 515366/week @ 2024-06-04 497887/week @ 2024-06-11 472728/week @ 2024-06-18 517094/week @ 2024-06-25 486488/week @ 2024-07-02 514253/week @ 2024-07-09 538779/week @ 2024-07-16 530546/week @ 2024-07-23 554211/week @ 2024-07-30 520825/week @ 2024-08-06

2,236,749 每月下载量
用于 2,750 个crate(直接使用11个)

MIT 许可证

52KB
1.5K SLoC

simd-adler32

docs.rs badge crates.io badge mit license badge

一个SIMD加速的Adler-32哈希算法实现。

功能

  • 无依赖项
  • 支持 no_std(使用 default-features = false
  • 运行时CPU特性检测(当启用 std 时)
  • 尽可能多的目标上的极致性能(目前仅限于x86和x86_64)
  • 当simd不可用时,默认使用标量实现

快速开始

Cargo.toml

[dependencies]
simd-adler32 = "*"

example.rs

use simd_adler32::Adler32;

let mut adler = Adler32::new();
adler.write(b"rust is pretty cool, man");
let hash = adler.finish();

println!("{}", hash);
// 1921255656

支持

CPU特性

impl arch feature
x86, x86_64 avx512
x86, x86_64 avx2
x86, x86_64 ssse3
x86, x86_64 sse2
🚧 arm, aarch64 neon
wasm32 simd128

MSRV 1.36.0**

在发布新版本之前,已测试最低支持的Rust版本。 [**] 要在 <1.51 的rustc版本上构建,需要禁用 const-generics 功能,可以通过更新依赖定义如下完成。

Cargo.toml

[dependencies]
simd-adler32 = { version "*", default-features = false, features = ["std"] }

性能

列出的基准测试显示随机生成的字节数(10k / 100k)和库名称。基准测试源代码可以在 bench 目录下找到。用于比较的crate是 adleradler32

Windows 10 Pro - Intel i5-8300H @ 2.30GHz

名称 平均时间 平均吞吐量
10k/simd-adler32 212.61 ns 43.805 GiB/s
10k/wuffs 3843 ns 2.63 GiB/s*
10k/adler32 4.8084 us 1.9369 GiB/s
10k/adler 17.979 us 530.43 MiB/s
----------------------- --------------- ------------------
100k/simd-adler32 2.7951微秒 33.320 GiB/s
100k/wuffs 34733纳秒 2.6814 GiB/s*
100k/adler32 48.488微秒 1.9207 GiB/s
100k/adler 178.36微秒 534.69 MiB/s

* wuffs 在 mingw64/gcc 上运行,使用 wuffs bench -ccompilers=gcc -reps=1 -iterscale=300 std/adler32 运行。

MacBookPro16,1 - Intel i9-9880H CPU @ 2.30GHz

名称 平均时间 平均吞吐量
10k/simd-adler32 200.37纳秒 46.480 GiB/s
10k/adler32 4.1516微秒 2.2433 GiB/s
10k/adler 10.220微秒 933.15 MiB/s
----------------------- --------------- ------------------
100k/simd-adler32 2.3282微秒 40.003 GiB/s
100k/adler32 41.130微秒 2.2643 GiB/s
100k/adler 83.776微秒 534.69 MiB/s

安全

由于对 simd 内置函数的要求,此包包含大量 unsafe 代码。发布前通过 afl 在发布和调试版本上执行模糊测试。模糊测试可以在 fuzz 目录下找到。

资源

致谢

感谢以下项目的贡献者。

贡献

请随时提交问题或拉取请求。 😄

无运行时依赖