mirror of
https://github.com/golang/go
synced 2024-11-15 02:00:33 -07:00
hash/maphash: sync wyhash with runtime implementation
Fixes #69940 Change-Id: I40535d2647f9456d2196241bf7414b1e92b53c2c Reviewed-on: https://go-review.googlesource.com/c/go/+/621756 Reviewed-by: Keith Randall <khr@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
cb69354de3
commit
0f2353997a
@ -13,6 +13,14 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var hashkey [4]uint64
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
for i := range hashkey {
|
||||||
|
hashkey[i] = randUint64()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func rthash(buf []byte, seed uint64) uint64 {
|
func rthash(buf []byte, seed uint64) uint64 {
|
||||||
if len(buf) == 0 {
|
if len(buf) == 0 {
|
||||||
return seed
|
return seed
|
||||||
@ -33,34 +41,28 @@ func randUint64() uint64 {
|
|||||||
// This is a port of wyhash implementation in runtime/hash64.go,
|
// This is a port of wyhash implementation in runtime/hash64.go,
|
||||||
// without using unsafe for purego.
|
// without using unsafe for purego.
|
||||||
|
|
||||||
const (
|
const m5 = 0x1d8e4e27c47d124f
|
||||||
m1 = 0xa0761d6478bd642f
|
|
||||||
m2 = 0xe7037ed1a0b428db
|
|
||||||
m3 = 0x8ebc6af09c88c6e3
|
|
||||||
m4 = 0x589965cc75374cc3
|
|
||||||
m5 = 0x1d8e4e27c47d124f
|
|
||||||
)
|
|
||||||
|
|
||||||
func wyhash(key []byte, seed, len uint64) uint64 {
|
func wyhash(key []byte, seed, len uint64) uint64 {
|
||||||
p := key
|
p := key
|
||||||
i := len
|
i := len
|
||||||
var a, b uint64
|
var a, b uint64
|
||||||
seed ^= m1
|
seed ^= hashkey[0]
|
||||||
|
|
||||||
if i > 16 {
|
if i > 16 {
|
||||||
if i > 48 {
|
if i > 48 {
|
||||||
seed1 := seed
|
seed1 := seed
|
||||||
seed2 := seed
|
seed2 := seed
|
||||||
for ; i > 48; i -= 48 {
|
for ; i > 48; i -= 48 {
|
||||||
seed = mix(r8(p)^m2, r8(p[8:])^seed)
|
seed = mix(r8(p)^hashkey[1], r8(p[8:])^seed)
|
||||||
seed1 = mix(r8(p[16:])^m3, r8(p[24:])^seed1)
|
seed1 = mix(r8(p[16:])^hashkey[2], r8(p[24:])^seed1)
|
||||||
seed2 = mix(r8(p[32:])^m4, r8(p[40:])^seed2)
|
seed2 = mix(r8(p[32:])^hashkey[3], r8(p[40:])^seed2)
|
||||||
p = p[48:]
|
p = p[48:]
|
||||||
}
|
}
|
||||||
seed ^= seed1 ^ seed2
|
seed ^= seed1 ^ seed2
|
||||||
}
|
}
|
||||||
for ; i > 16; i -= 16 {
|
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:]
|
p = p[16:]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,7 +76,7 @@ func wyhash(key []byte, seed, len uint64) uint64 {
|
|||||||
a = r4(p)<<32 | r4(p[n:])
|
a = r4(p)<<32 | r4(p[n:])
|
||||||
b = r4(p[i-4:])<<32 | r4(p[i-4-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 {
|
func r3(p []byte, k uint64) uint64 {
|
||||||
|
Loading…
Reference in New Issue
Block a user