wyhash-final4 ============= This crate provides a pure rust implementation of wyhash_final4, the latest version of wyhash as of January 2024; wyhash which is an extremely fast hash function that can be implemented without any machine-specific instructions, while producing high quality hash result. See [smhasher] for hash function comparison details. Related works ------------- There are several other implementations of wyhash in rust, but none of them provides the latest version of wyhash (that is, the `final4`). - [wyhash](https://github.com/eldruin/wyhash-rs) - [wy](https://github.com/DoumanAsh/wyhash) - [wyhash2](https://crates.io/crates/wyhash2) Variants -------- This crate provides all the 4 variants of wyhash, namely - `WyHash64`, the default variant, using 64-bit multiplication for mixing. - `WyHash64Condom`, using 64-bit multiplication and an extra bit-xor for mixing - `WyHash32`, using 32-bit multiplication for mixing. - `WyHash32Condom`, using 32-bit multiplication and an extra bit-xor for mixing It worth nothing to note that, - the 32-bit variants are faster on 32-bit platform, but much slower on 64-bit platform; - the `Condom` variants are slightly slower due to an extra bit-xor was used when mixing. As wyhash use multiplication for mixing, for some particular input (with a negligible probability of 2^-64 for WyHash64) the mixing becomes multiplying by zero, thus losing all the entropy. The `Condom` variants are resistant to this problem thanks to the extra bit-xor. If you are not sure which variant to use, just use `WyHash64`. Usage ----- This crate provides three ways to hash inputs: - One-shot hashing, e.g. just call `WyHash64::hash(input)` to get the hash result. This is the simplest and the recommended way when default seed and secrets are used. There are also `Wyhash::hash_with_seed` and `Wyhash::hash_with_secret` for one-shot hashing with custom seed and secret, but unless the seed and secret changed over time, it's better to use the following methods. - Create an instance of`WyHash` with `with_seed` or `with_seed_and_secret` before hashing, e.g. ``` let hasher = WyHash64::with_seed(fix_seed); hasher.hash(input1); hasher.hash(input2); ``` The `hasher` can be reused for hashing multiple inputs, when seed and secret are fixed. It's faster than one-shot hashing in this scenario, as the initialization work will be done only once. - Streamed hashing. When the input is too large to fit into a single buffer, or the length of input is unknown at the beginning, streamed hasher can be used. ``` let mut hasher = WyHash64::with_seed(seed).streamed(); hasher.write(chunk1); hasher.write(chunk2); hasher.write(chunk3); let hash = hasher.finish(); ``` Also, `WyHasher` implements the `std::hash::Hasher` and `std::hash::BuildHasher` trait, thus can be used as a custom hasher for `HashMap` and `HashSet`. Build Features ------------- There are several build features that can be enabled or disabled: - `std`. Disable this feature will make `std::hash::Hasher` and `std::hash::BuildHasher` not be implemented for `WhHasher`, while make this crate `no_std` compatible. - `wyhash64`, `wyhash64_condom`, `wyhash32`, `wyhash32_condom`. Each of these features enables the corresponding variant of wyhash. All the features are enabled by default. [smhasher]: https://github.com/rurban/smhasher License ======= The MIT License. See LICENSE file for details.