# murmur3_32   [![crate]][crates.io] [![docs]][docs.rs]
[crate]: https://img.shields.io/crates/v/murmur3_32.svg
[crates.io]: https://crates.io/crates/murmur3_32
[docs]: https://img.shields.io/docsrs/murmur3_32
[docs.rs]: https://docs.rs/murmur3_32
[Rust](https://www.rust-lang.org/) implementation of [MurmurHash3](https://en.wikipedia.org/wiki/MurmurHash#MurmurHash3) (32bit) non-cryptographic hash algorithm.
## features
- highly optimized
- optional `no_std` support
- `Murmur3Io` implements [`Read`](https://doc.rust-lang.org/stable/std/io/trait.Read.html)/[`Write`](https://doc.rust-lang.org/stable/std/io/trait.Write.html) (passthrough hasher)
- `Murmur3` implements [`Hasher`](https://doc.rust-lang.org/stable/std/hash/trait.Hasher.html)
- `Murmur3` implements [`Default`](https://doc.rust-lang.org/stable/core/default/trait.Default.html) with seed value of `0`
- MSRV 1.86
## basic usage
```rust
const SEED: u32 = 1234;
let mut hasher = murmur3_32::Murmur3::new(SEED);
hasher.write(&[1, 2, 3, 4, 5, 6]);
hasher.write(&[7, 8, 9]);
let hash = hasher.finish();
assert_eq!(hash, 3_401_546_948);
```
## basic usage - single slice
```rust
const SEED: u32 = 1234;
let hash = murmur3_32::Murmur3::hash(SEED, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
assert_eq!(hash, 3_401_546_948);
```
## usage as `std::io::Write`
```rust
use std::io::{self, Write as _};
const SEED: u32 = 1234;
let mut stdout = murmur3_32::Murmur3Io::new(SEED, io::stdout());
write!(stdout, "Hello").unwrap();
writeln!(stdout, ", World!").unwrap();
let (hash, _stdout) = stdout.finish();
assert_eq!(hash, 2_175_319_754);
```
## usage as `std::io::Read`
```rust
use std::io;
const SEED: u32 = 1234;
let mut reader = murmur3_32::Murmur3Io::new(SEED, b"Hello, World!\n".as_slice());
io::copy(&mut reader, &mut io::empty()).unwrap();
let (hash, _slice) = reader.finish();
assert_eq!(hash, 2_175_319_754);
```
## `no_std` usage
```
cargo add murmur3_32 --no-default-features
```
> [!NOTE]
> `Murmur3Io` is unavailable in `no_std` context