64 bit variant of Murmur2. Has the same problems as Murmur2 on keys not a multiple of 8, but slightly better mixing otherwise.
finline u64 fastcall Murmur264( const u8 *key, u64 len, u64 seed ) {
const u64 m = 0xc6a4a7935bd1e995;
const u8 r = 47;
u64 h = len + seed;
for ( ; len >= 8; len -= 8, key += 8 ) {
u64 k = *(u64 *)key * m;
k ^= k >> r;
k *= m;
h = ( h * m ) ^ k;
}
switch ( len & 7 ) {
case 7: h ^= u64(key[6]) << 48;
case 6: h ^= u64(key[5]) << 40;
case 5: h ^= u64(key[4]) << 32;
case 4: h ^= u64(key[3]) << 24;
case 3: h ^= u64(key[2]) << 16;
case 2: h ^= u64(key[1]) << 8;
case 1: h ^= u64(key[0]);
h *= m;
}
h ^= h >> r;
h *= m;
h ^= h >> r;
return h;
}