Murmur3Sum128 implements murmur3sum128 hash algorithm
(key unsafe.Pointer, bytes int, seed uint32)
| 88 | |
| 89 | // Murmur3Sum128 implements murmur3sum128 hash algorithm |
| 90 | func Murmur3Sum128(key unsafe.Pointer, bytes int, seed uint32) (out [2]uint64) { |
| 91 | var data = uintptr(key) |
| 92 | nblocks := bytes / 16 |
| 93 | |
| 94 | var i int |
| 95 | var h1 = uint64(seed) |
| 96 | var h2 = uint64(seed) |
| 97 | |
| 98 | var c1 uint64 = 0x87c37b91114253d5 |
| 99 | var c2 uint64 = 0x4cf5ad432745937f |
| 100 | |
| 101 | blocks := data |
| 102 | for i = 0; i < nblocks; i++ { |
| 103 | k1 := *(*uint64)(unsafe.Pointer(blocks + uintptr(i*2)*8)) |
| 104 | k2 := *(*uint64)(unsafe.Pointer(blocks + uintptr(i*2+1)*8)) |
| 105 | |
| 106 | k1 *= c1 |
| 107 | k1 = rotl64(k1, 31) |
| 108 | k1 *= c2 |
| 109 | h1 ^= k1 |
| 110 | |
| 111 | h1 = rotl64(h1, 27) |
| 112 | h1 += h2 |
| 113 | h1 = h1*5 + 0x52dce729 |
| 114 | |
| 115 | k2 *= c2 |
| 116 | k2 = rotl64(k2, 33) |
| 117 | k2 *= c1 |
| 118 | h2 ^= k2 |
| 119 | |
| 120 | h2 = rotl64(h2, 31) |
| 121 | h2 += h1 |
| 122 | h2 = h2*5 + 0x38495ab5 |
| 123 | } |
| 124 | |
| 125 | tail := data + uintptr(nblocks)*16 |
| 126 | var k1 uint64 = 0 |
| 127 | var k2 uint64 = 0 |
| 128 | |
| 129 | switch bytes & 15 { |
| 130 | case 15: |
| 131 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(14)))) << 48 |
| 132 | fallthrough |
| 133 | case 14: |
| 134 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(13)))) << 40 |
| 135 | fallthrough |
| 136 | case 13: |
| 137 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(12)))) << 32 |
| 138 | fallthrough |
| 139 | case 12: |
| 140 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(11)))) << 24 |
| 141 | fallthrough |
| 142 | case 11: |
| 143 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(10)))) << 16 |
| 144 | fallthrough |
| 145 | case 10: |
| 146 | k2 ^= uint64(*(*uint8)(unsafe.Pointer(tail + uintptr(9)))) << 8 |
| 147 | fallthrough |
no test coverage detected