GoCollections/lang/Hash.go

42 lines
713 B
Go
Raw Normal View History

2022-03-23 10:15:18 +08:00
package lang
import (
"unsafe"
)
//goland:noinspection GoVetUnsafePointer
func HashAddr[V any](v *V) int32 {
p := uintptr(unsafe.Pointer(v))
remain := int32(unsafe.Sizeof(*v))
hash := int32(0)
for remain-4 >= 0 {
remain -= 4
hash = hash*31 ^ *(*int32)(unsafe.Pointer(p))
p += 4
}
for remain > 0 {
hash = hash*31 ^ int32(*(*int8)(unsafe.Pointer(p)))
p++
remain--
}
return hash
}
func Hash32[T any](p *T) int32 {
return *(*int32)(unsafe.Pointer(p))
}
func Hash64[T any](p *T) int32 {
i := *(*int64)(unsafe.Pointer(p))
2022-03-28 18:19:05 +08:00
return int32(i) ^ int32(i>>32)
2022-03-23 10:15:18 +08:00
}
func HashString(str string) int32 {
hashCode := int32(0)
for _, r := range str {
hashCode = 31*hashCode + r
}
return hashCode
}