in utils/hash.go [90:199]
func Murmur3Sum128(key unsafe.Pointer, bytes int, seed uint32) (out [2]uint64) {
var data = uintptr(key)
nblocks := bytes / 16
var i int
var h1 = uint64(seed)
var h2 = uint64(seed)
var c1 uint64 = 0x87c37b91114253d5
var c2 uint64 = 0x4cf5ad432745937f
blocks := data
for i = 0; i < nblocks; i++ {
k1 := *(*uint64)(unsafe.Pointer(blocks + uintptr(i*2)*8))
k2 := *(*uint64)(unsafe.Pointer(blocks + uintptr(i*2+1)*8))
k1 *= c1
k1 = rotl64(k1, 31)
k1 *= c2
h1 ^= k1
h1 = rotl64(h1, 27)
h1 += h2
h1 = h1*5 + 0x52dce729
k2 *= c2
k2 = rotl64(k2, 33)
k2 *= c1
h2 ^= k2
h2 = rotl64(h2, 31)
h2 += h1
h2 = h2*5 + 0x38495ab5
}
tail := data + uintptr(nblocks)*16
var k1 uint64 = 0
var k2 uint64 = 0
switch bytes & 15 {
case 15:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(14)))) << 48
fallthrough
case 14:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(13)))) << 40
fallthrough
case 13:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(12)))) << 32
fallthrough
case 12:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(11)))) << 24
fallthrough
case 11:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(10)))) << 16
fallthrough
case 10:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(9)))) << 8
fallthrough
case 9:
k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(8))))
k2 *= c2
k2 = rotl64(k2, 33)
k2 *= c1
h2 ^= k2
fallthrough
case 8:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(7)))) << 56
fallthrough
case 7:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(6)))) << 48
fallthrough
case 6:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(5)))) << 40
fallthrough
case 5:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(4)))) << 32
fallthrough
case 4:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(3)))) << 24
fallthrough
case 3:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(2)))) << 16
fallthrough
case 2:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(1)))) << 8
fallthrough
case 1:
k1 ^= uint64(*(*uint8)(unsafe.Pointer(tail)))
k1 *= c1
k1 = rotl64(k1, 31)
k1 *= c2
h1 ^= k1
}
h1 ^= uint64(bytes)
h2 ^= uint64(bytes)
h1 += h2
h2 += h1
h1 = fmix64(h1)
h2 = fmix64(h2)
h1 += h2
h2 += h1
out[0] = h1
out[1] = h2
return
}