MCPcopy
hub / github.com/uber/aresdb / Murmur3Sum128

Function Murmur3Sum128

utils/hash.go:90–199  ·  view source on GitHub ↗

Murmur3Sum128 implements murmur3sum128 hash algorithm

(key unsafe.Pointer, bytes int, seed uint32)

Source from the content-addressed store, hash-verified

88
89// Murmur3Sum128 implements murmur3sum128 hash algorithm
90func 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

Callers 2

hash_test.goFile · 0.85
Murmur3Sum64Function · 0.85

Calls 2

rotl64Function · 0.85
fmix64Function · 0.85

Tested by

no test coverage detected