package runtime
import (
"runtime/internal/math"
"unsafe"
)
const (
m1 = 0xa0761d6478bd642f
m2 = 0xe7037ed1a0b428db
m3 = 0x8ebc6af09c88c6e3
m4 = 0x589965cc75374cc3
m5 = 0x1d8e4e27c47d124f
)
func memhashFallback (p unsafe .Pointer , seed , s uintptr ) uintptr {
var a , b uintptr
seed ^= hashkey [0 ] ^ m1
switch {
case s == 0 :
return seed
case s < 4 :
a = uintptr (*(*byte )(p ))
a |= uintptr (*(*byte )(add (p , s >>1 ))) << 8
a |= uintptr (*(*byte )(add (p , s -1 ))) << 16
case s == 4 :
a = r4 (p )
b = a
case s < 8 :
a = r4 (p )
b = r4 (add (p , s -4 ))
case s == 8 :
a = r8 (p )
b = a
case s <= 16 :
a = r8 (p )
b = r8 (add (p , s -8 ))
default :
l := s
if l > 48 {
seed1 := seed
seed2 := seed
for ; l > 48 ; l -= 48 {
seed = mix (r8 (p )^m2 , r8 (add (p , 8 ))^seed )
seed1 = mix (r8 (add (p , 16 ))^m3 , r8 (add (p , 24 ))^seed1 )
seed2 = mix (r8 (add (p , 32 ))^m4 , r8 (add (p , 40 ))^seed2 )
p = add (p , 48 )
}
seed ^= seed1 ^ seed2
}
for ; l > 16 ; l -= 16 {
seed = mix (r8 (p )^m2 , r8 (add (p , 8 ))^seed )
p = add (p , 16 )
}
a = r8 (add (p , l -16 ))
b = r8 (add (p , l -8 ))
}
return mix (m5 ^s , mix (a ^m2 , b ^seed ))
}
func memhash32Fallback (p unsafe .Pointer , seed uintptr ) uintptr {
a := r4 (p )
return mix (m5 ^4 , mix (a ^m2 , a ^seed ^hashkey [0 ]^m1 ))
}
func memhash64Fallback (p unsafe .Pointer , seed uintptr ) uintptr {
a := r8 (p )
return mix (m5 ^8 , mix (a ^m2 , a ^seed ^hashkey [0 ]^m1 ))
}
func mix (a , b uintptr ) uintptr {
hi , lo := math .Mul64 (uint64 (a ), uint64 (b ))
return uintptr (hi ^ lo )
}
func r4 (p unsafe .Pointer ) uintptr {
return uintptr (readUnaligned32 (p ))
}
func r8 (p unsafe .Pointer ) uintptr {
return uintptr (readUnaligned64 (p ))
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .