Fastmurmur3
Murmur3 is a fast, non-cryptographic hash function. fastmurmur3
is, in my testing, the fastest implementation of Murmur3.
Usage
let bytes: &[u8] = b"hello world";
let x: u128 = fastmurmur3::hash(bytes);
Installation
cargo install fastmurmur3
Benchmarks
Summary
According to current benchmarks (and excluding FxHasher
):
fastmurmur3
is the fastest.xxh3_64
is 1.66x slower and only has a 64-bit value.xxh3_128
is 2.50x slower.fasthash
contains the next fastest murmur3 implementation, but is still 4.47x slower thanfastmurmur3
.
Data
rustc_hash::FxHasher time: [243.91 ps 244.60 ps 245.30 ps]
fastmurmur3 time: [3.0878 ns 3.1215 ns 3.1619 ns]
xxhash_rust::xxh3_64 time: [5.1473 ns 5.1872 ns 5.2456 ns]
xxhash_rust::xxh3_128 time: [7.8066 ns 7.8271 ns 7.8499 ns]
fasthash time: [13.909 ns 13.960 ns 14.018 ns]
murmur3c time: [14.529 ns 14.604 ns 14.684 ns]
murmur3 time: [26.084 ns 26.163 ns 26.249 ns]
twox_hash::Xxh3Hash64 time: [124.23 ns 126.46 ns 128.55 ns]
twox_hash::Xxh3Hash128 time: [134.62 ns 136.75 ns 138.77 ns]
sha1 time: [209.55 ns 211.71 ns 214.88 ns]
Benchmark Future Work
-
These benchmarks are run on a limited input set and with a limited seed set. These more extensive benchmarks need to happen before definitively making the claim that
fastmurmur3
is the fastest non-cryptographic hash function. -
Besides speed, these benchmarks could also measure other important hash properties like collision-resistance in comparison to other algorithms (
xxhash
, etc.). -
I exclude
FxHash
from the benchmark summary because I don't know if it's been tested for general use beyond the rust compiler. If that has been done, and it proves to be general purpose, FxHash could be preferable tofastmurmur3
. -
It'd be nice to have pretty charts of the benchmarks.
Correctness
The tests for fastmurmur3
perform fuzzing in comparison to the C implementation.
Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request