murmur2/lib.rs
1//! # murmur2 Hash Functions
2//!
3//! This is a pure Rust implementation of the murmur2 hash functions.
4//! It is tested against the [original C++ implementation](https://github.com/aappleby/smhasher/).
5//! To keep this crate `no_std` and dependency free,
6//! the tests live in a different crate, which is not published to crates.io.
7//! The implementations have not been particularly optimized for performance.
8//!
9//! The original C++ implementations are architecture/endianness dependent.
10//! The only independent function provided is `MurmurHashNeutral2`.
11//! This crate does not follow that scheme,
12//! all functions are provided in an endianness-dependent and -independent version.
13//! The endianness-dependent versions have their name suffixed with a `ne`, for "native endian".
14#![cfg_attr(not(test), no_std)]
15
16#[macro_use]
17mod hlp;
18mod imp;
19#[cfg(test)]
20mod test;
21
22/// Endianness-independent `MurmurHash2`
23///
24/// This is the only function where an endianness-independent version is provided by the original C++ code,
25/// called `MurmurHashNeutral2` there.
26pub fn murmur2(data: &[u8], seed: u32) -> u32 {
27 imp::murmur2(data, seed, u32::from_le_bytes)
28}
29
30/// `MurmurHash2`
31pub fn murmur2ne(data: &[u8], seed: u32) -> u32 {
32 imp::murmur2(data, seed, u32::from_ne_bytes)
33}
34
35/// Endianness-independent `MurmurHash2A`
36pub fn murmur2a(data: &[u8], seed: u32) -> u32 {
37 imp::murmur2a(data, seed, u32::from_le_bytes)
38}
39
40/// `MurmurHash2A`
41pub fn murmur2ane(data: &[u8], seed: u32) -> u32 {
42 imp::murmur2a(data, seed, u32::from_ne_bytes)
43}
44
45/// Endianness-independent `MurmurHash64A`
46pub fn murmur64a(data: &[u8], seed: u64) -> u64 {
47 imp::murmur64a(data, seed, u64::from_le_bytes)
48}
49
50/// `MurmurHash64A`
51pub fn murmur64ane(data: &[u8], seed: u64) -> u64 {
52 imp::murmur64a(data, seed, u64::from_ne_bytes)
53}
54
55/// Endianness-independent `MurmurHash64B`
56pub fn murmur64b(data: &[u8], seed: u64) -> u64 {
57 imp::murmur64b(data, seed, u32::from_le_bytes)
58}
59
60/// `MurmurHash64B`
61pub fn murmur64bne(data: &[u8], seed: u64) -> u64 {
62 imp::murmur64b(data, seed, u32::from_ne_bytes)
63}
64
65/// Seed found in [Kafka source](https://github.com/apache/kafka/blob/3.1.0/clients/src/main/java/org/apache/kafka/common/utils/Utils.java#L479).
66// No idea where they took it from
67pub const KAFKA_SEED: u32 = 0x9747b28c;