#adler32 #simd #avx2 #adler #ssse3

no-std simd-adler32

A SIMD-accelerated Adler-32 hash algorithm implementation

9 releases

0.3.7 Jul 24, 2023
0.3.6 Jul 24, 2023
0.3.5 Mar 13, 2023
0.3.4 Oct 12, 2021
0.1.0 Apr 9, 2021

#91 in Algorithms

Download history 217853/week @ 2023-11-26 208006/week @ 2023-12-03 272407/week @ 2023-12-10 244157/week @ 2023-12-17 131320/week @ 2023-12-24 230681/week @ 2023-12-31 274402/week @ 2024-01-07 233715/week @ 2024-01-14 235367/week @ 2024-01-21 242144/week @ 2024-01-28 262054/week @ 2024-02-04 268643/week @ 2024-02-11 249880/week @ 2024-02-18 300491/week @ 2024-02-25 299199/week @ 2024-03-03 128300/week @ 2024-03-10

999,918 downloads per month
Used in 2,465 crates (6 directly)

MIT license

52KB
1.5K SLoC

simd-adler32

docs.rs badge crates.io badge mit license badge

A SIMD-accelerated Adler-32 hash algorithm implementation.

Features

  • No dependencies
  • Support no_std (with default-features = false)
  • Runtime CPU feature detection (when std enabled)
  • Blazing fast performance on as many targets as possible (currently only x86 and x86_64)
  • Default to scalar implementation when simd not available

Quick start

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

Support

CPU Features

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**

Minimum supported rust version is tested before a new version is published. [**] Feature const-generics needs to disabled to build on rustc versions <1.51 which can be done by updating your dependency definition to the following.

Cargo.toml

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

Performance

Benchmarks listed display number of randomly generated bytes (10k / 100k) and library name. Benchmarks sources can be found under the bench directory. Crates used for comparison are adler and adler32.

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

name avg. time avg. thrpt
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 us 33.320 GiB/s
100k/wuffs 34733 ns 2.6814 GiB/s*
100k/adler32 48.488 us 1.9207 GiB/s
100k/adler 178.36 us 534.69 MiB/s

* wuffs ran using mingw64/gcc, ran with wuffs bench -ccompilers=gcc -reps=1 -iterscale=300 std/adler32.

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

name avg. time avg. thrpt
10k/simd-adler32 200.37 ns 46.480 GiB/s
10k/adler32 4.1516 us 2.2433 GiB/s
10k/adler 10.220 us 933.15 MiB/s
----------------------- --------------- ------------------
100k/simd-adler32 2.3282 us 40.003 GiB/s
100k/adler32 41.130 us 2.2643 GiB/s
100k/adler 83.776 us 534.69 MiB/s

Safety

This crate contains a significant amount of unsafe code due to the requirement of unsafe for simd intrinsics. Fuzzing is done on release and debug builds prior to publishing via afl. Fuzzy tests can be found under fuzz the directory.

Resources

Credits

Thank you to the contributors of the following projects.

Contributing

Feel free to submit a issue or pull request. 😄

No runtime deps