wyhash-final4 0.2.0

The rust implementation of wyhash final4 hash function
Documentation
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.