@@ -13,6 +13,14 @@ import (
13
13
"reflect"
14
14
)
15
15
16
+ var hashkey [4 ]uint64
17
+
18
+ func init () {
19
+ for i := range hashkey {
20
+ hashkey [i ] = randUint64 ()
21
+ }
22
+ }
23
+
16
24
func rthash (buf []byte , seed uint64 ) uint64 {
17
25
if len (buf ) == 0 {
18
26
return seed
@@ -33,34 +41,28 @@ func randUint64() uint64 {
33
41
// This is a port of wyhash implementation in runtime/hash64.go,
34
42
// without using unsafe for purego.
35
43
36
- const (
37
- m1 = 0xa0761d6478bd642f
38
- m2 = 0xe7037ed1a0b428db
39
- m3 = 0x8ebc6af09c88c6e3
40
- m4 = 0x589965cc75374cc3
41
- m5 = 0x1d8e4e27c47d124f
42
- )
44
+ const m5 = 0x1d8e4e27c47d124f
43
45
44
46
func wyhash (key []byte , seed , len uint64 ) uint64 {
45
47
p := key
46
48
i := len
47
49
var a , b uint64
48
- seed ^= m1
50
+ seed ^= hashkey [ 0 ]
49
51
50
52
if i > 16 {
51
53
if i > 48 {
52
54
seed1 := seed
53
55
seed2 := seed
54
56
for ; i > 48 ; i -= 48 {
55
- seed = mix (r8 (p )^ m2 , r8 (p [8 :])^ seed )
56
- seed1 = mix (r8 (p [16 :])^ m3 , r8 (p [24 :])^ seed1 )
57
- seed2 = mix (r8 (p [32 :])^ m4 , r8 (p [40 :])^ seed2 )
57
+ seed = mix (r8 (p )^ hashkey [ 1 ] , r8 (p [8 :])^ seed )
58
+ seed1 = mix (r8 (p [16 :])^ hashkey [ 2 ] , r8 (p [24 :])^ seed1 )
59
+ seed2 = mix (r8 (p [32 :])^ hashkey [ 3 ] , r8 (p [40 :])^ seed2 )
58
60
p = p [48 :]
59
61
}
60
62
seed ^= seed1 ^ seed2
61
63
}
62
64
for ; i > 16 ; i -= 16 {
63
- seed = mix (r8 (p )^ m2 , r8 (p [8 :])^ seed )
65
+ seed = mix (r8 (p )^ hashkey [ 1 ] , r8 (p [8 :])^ seed )
64
66
p = p [16 :]
65
67
}
66
68
}
@@ -74,7 +76,7 @@ func wyhash(key []byte, seed, len uint64) uint64 {
74
76
a = r4 (p )<< 32 | r4 (p [n :])
75
77
b = r4 (p [i - 4 :])<< 32 | r4 (p [i - 4 - n :])
76
78
}
77
- return mix (m5 ^ len , mix (a ^ m2 , b ^ seed ))
79
+ return mix (m5 ^ len , mix (a ^ hashkey [ 1 ] , b ^ seed ))
78
80
}
79
81
80
82
func r3 (p []byte , k uint64 ) uint64 {
0 commit comments