Skip to content

Instantly share code, notes, and snippets.

@jweinst1
Created November 29, 2025 22:26
Show Gist options
  • Select an option

  • Save jweinst1/46d9e3fb3fb8868c4dae4e7ba861cbd5 to your computer and use it in GitHub Desktop.

Select an option

Save jweinst1/46d9e3fb3fb8868c4dae4e7ba861cbd5 to your computer and use it in GitHub Desktop.
murmur3 in rust
pub fn murmur3_x64_64(data: &[u8], seed: u64) -> u64 {
let mut h1 = seed;
let mut h2 = seed;
const C1: u64 = 0x87c37b91114253d5;
const C2: u64 = 0x4cf5ad432745937f;
let mut i = 0;
let len = data.len();
while i + 16 <= len {
let k1 = u64::from_le_bytes(data[i..i + 8].try_into().unwrap());
let k2 = u64::from_le_bytes(data[i + 8..i + 16].try_into().unwrap());
i += 16;
let mut k1 = k1.wrapping_mul(C1);
k1 = k1.rotate_left(31);
k1 = k1.wrapping_mul(C2);
h1 ^= k1;
h1 = h1.rotate_left(27).wrapping_add(h2);
h1 = h1.wrapping_mul(5).wrapping_add(0x52dce729);
let mut k2 = k2.wrapping_mul(C2);
k2 = k2.rotate_left(33);
k2 = k2.wrapping_mul(C1);
h2 ^= k2;
h2 = h2.rotate_left(31).wrapping_add(h1);
h2 = h2.wrapping_mul(5).wrapping_add(0x38495ab5);
}
// Tail
let mut k1 = 0u64;
let mut k2 = 0u64;
let rem = len & 15;
if rem > 0 {
for j in (0..rem).rev() {
let byte = data[i + j] as u64;
if j < 8 {
k1 |= byte << (j * 8);
} else {
k2 |= byte << ((j - 8) * 8);
}
}
if k1 != 0 {
k1 = k1.wrapping_mul(C1);
k1 = k1.rotate_left(31);
k1 = k1.wrapping_mul(C2);
h1 ^= k1;
}
if k2 != 0 {
k2 = k2.wrapping_mul(C2);
k2 = k2.rotate_left(33);
k2 = k2.wrapping_mul(C1);
h2 ^= k2;
}
}
// Finalization
h1 ^= len as u64;
h2 ^= len as u64;
h1 = h1.wrapping_add(h2);
h2 = h2.wrapping_add(h1);
h1 = fmix64(h1);
h2 = fmix64(h2);
h1 = h1.wrapping_add(h2);
// Optionally: h2 = h2.wrapping_add(h1); // we don’t use h2
h1
}
fn fmix64(mut k: u64) -> u64 {
k ^= k >> 33;
k = k.wrapping_mul(0xff51afd7ed558ccd);
k ^= k >> 33;
k = k.wrapping_mul(0xc4ceb9fe1a85ec53);
k ^= k >> 33;
k
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment