Rust implementation of the wyhash algorithm by Wang Yi.
The hashing algorithm passes SMHasher and the random number generator passes BigCrush and practrand. As of now it is the fastest algorithm in the SMHasher benchmark (faster than t1ha and XXH3). See here.
Furthermore, this algorithm is solid, simple, portable (does not need hardware support, can be
used in no_std
environments) and has no dependencies (except the traits from rand_core
).
The generated hashes are equal (see tests) as of the version stated here although the speed varies (PRs are welcome).
By default this crate uses 128-bit integer multiplications.
To restrict that to 64 bits you can enable the feature mum32bit
. This offers better
performance on 32-bit architectures.
Beware that this feature produces different results.
This crate provides free functions as well as implementations of the Hasher
, Rng
and
SeedableRng
traits.
use core::hash::Hasher;
use wyhash::{make_secret, WyHash};
fn main() {
let secret = make_secret(3);
let mut hasher = WyHash::new(4, secret);
hasher.write(&[0, 1, 2]);
assert_eq!(0x8301_42a2_4404_5ff4, hasher.finish());
}
See further examples of the hasher and RNG in the documentation.
A basic performance comparison benchmark against fnv
, twox-hash
, metrohash
and the standard hash_map hash collections::hash_map::DefaultHasher
is included in the sources and you can run it with nightly Rust:
cargo +nightly bench
For questions, issues, feature requests, and other changes, please file an issue in the github project.
This crate is guaranteed to compile on stable Rust 1.36.0 and up. It might compile with older versions but that may change in any new patch release.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.