package runtime
import (
"runtime/internal/math"
"unsafe"
)
const (
m5 = 0x1d8e4e27c47d124f
)
func memhashFallback(p unsafe .Pointer , seed , s uintptr ) uintptr {
var a , b uintptr
seed ^= hashkey [0 ]
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 )^hashkey [1 ], r8 (add (p , 8 ))^seed )
seed1 = mix (r8 (add (p , 16 ))^hashkey [2 ], r8 (add (p , 24 ))^seed1 )
seed2 = mix (r8 (add (p , 32 ))^hashkey [3 ], r8 (add (p , 40 ))^seed2 )
p = add (p , 48 )
}
seed ^= seed1 ^ seed2
}
for ; l > 16 ; l -= 16 {
seed = mix (r8 (p )^hashkey [1 ], 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 ^hashkey [1 ], b ^seed ))
}
func memhash32Fallback(p unsafe .Pointer , seed uintptr ) uintptr {
a := r4 (p )
return mix (m5 ^4 , mix (a ^hashkey [1 ], a ^seed ^hashkey [0 ]))
}
func memhash64Fallback(p unsafe .Pointer , seed uintptr ) uintptr {
a := r8 (p )
return mix (m5 ^8 , mix (a ^hashkey [1 ], a ^seed ^hashkey [0 ]))
}
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.7.0-preview . (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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds .