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
|
|
|
|
}
|