func Murmur3Sum128()

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
}