"reflect"
)
+var hashkey [4]uint64
+
+func init() {
+ for i := range hashkey {
+ hashkey[i] = randUint64()
+ }
+}
+
func rthash(buf []byte, seed uint64) uint64 {
if len(buf) == 0 {
return seed
// This is a port of wyhash implementation in runtime/hash64.go,
// without using unsafe for purego.
-const (
- m1 = 0xa0761d6478bd642f
- m2 = 0xe7037ed1a0b428db
- m3 = 0x8ebc6af09c88c6e3
- m4 = 0x589965cc75374cc3
- m5 = 0x1d8e4e27c47d124f
-)
+const m5 = 0x1d8e4e27c47d124f
func wyhash(key []byte, seed, len uint64) uint64 {
p := key
i := len
var a, b uint64
- seed ^= m1
+ seed ^= hashkey[0]
if i > 16 {
if i > 48 {
seed1 := seed
seed2 := seed
for ; i > 48; i -= 48 {
- seed = mix(r8(p)^m2, r8(p[8:])^seed)
- seed1 = mix(r8(p[16:])^m3, r8(p[24:])^seed1)
- seed2 = mix(r8(p[32:])^m4, r8(p[40:])^seed2)
+ seed = mix(r8(p)^hashkey[1], r8(p[8:])^seed)
+ seed1 = mix(r8(p[16:])^hashkey[2], r8(p[24:])^seed1)
+ seed2 = mix(r8(p[32:])^hashkey[3], r8(p[40:])^seed2)
p = p[48:]
}
seed ^= seed1 ^ seed2
}
for ; i > 16; i -= 16 {
- seed = mix(r8(p)^m2, r8(p[8:])^seed)
+ seed = mix(r8(p)^hashkey[1], r8(p[8:])^seed)
p = p[16:]
}
}
a = r4(p)<<32 | r4(p[n:])
b = r4(p[i-4:])<<32 | r4(p[i-4-n:])
}
- return mix(m5^len, mix(a^m2, b^seed))
+ return mix(m5^len, mix(a^hashkey[1], b^seed))
}
func r3(p []byte, k uint64) uint64 {