src/runtime: add leveldb memhash
Этот коммит содержится в:
родитель
11e1b2148f
коммит
7a61cb1bc3
2 изменённых файлов: 76 добавлений и 2 удалений
|
@ -1,5 +1,5 @@
|
||||||
//go:build !runtime_memhash_tsip
|
//go:build !runtime_memhash_tsip && !runtime_memhash_leveldb
|
||||||
// +build !runtime_memhash_tsip
|
// +build !runtime_memhash_tsip,!runtime_memhash_leveldb
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
|
|
74
src/runtime/memhash_leveldb.go
Обычный файл
74
src/runtime/memhash_leveldb.go
Обычный файл
|
@ -0,0 +1,74 @@
|
||||||
|
//go:build runtime_memhash_leveldb
|
||||||
|
// +build runtime_memhash_leveldb
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ptrToSlice(ptr unsafe.Pointer, n uintptr) []byte {
|
||||||
|
var p []byte
|
||||||
|
|
||||||
|
type _bslice struct {
|
||||||
|
ptr *byte
|
||||||
|
len uintptr
|
||||||
|
cap uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
pslice := (*_bslice)(unsafe.Pointer(&p))
|
||||||
|
pslice.ptr = (*byte)(ptr)
|
||||||
|
pslice.cap = n
|
||||||
|
pslice.len = n
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// leveldb hash
|
||||||
|
func hash32(ptr unsafe.Pointer, n, seed uintptr) uint32 {
|
||||||
|
|
||||||
|
const (
|
||||||
|
lseed = 0xbc9f1d34
|
||||||
|
m = 0xc6a4a793
|
||||||
|
)
|
||||||
|
|
||||||
|
b := ptrToSlice(ptr, n)
|
||||||
|
|
||||||
|
h := uint32(lseed^seed) ^ uint32(uint(len(b))*uint(m))
|
||||||
|
|
||||||
|
for ; len(b) >= 4; b = b[4:] {
|
||||||
|
h += uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
|
||||||
|
h *= m
|
||||||
|
h ^= h >> 16
|
||||||
|
}
|
||||||
|
switch len(b) {
|
||||||
|
case 3:
|
||||||
|
h += uint32(b[2]) << 16
|
||||||
|
fallthrough
|
||||||
|
case 2:
|
||||||
|
h += uint32(b[1]) << 8
|
||||||
|
fallthrough
|
||||||
|
case 1:
|
||||||
|
h += uint32(b[0])
|
||||||
|
h *= m
|
||||||
|
h ^= h >> 24
|
||||||
|
}
|
||||||
|
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash64finalizer(key uint64) uint64 {
|
||||||
|
key = ^key + (key << 21) // key = (key << 21) - key - 1;
|
||||||
|
key = key ^ (key >> 24)
|
||||||
|
key = (key + (key << 3)) + (key << 8) // key * 265
|
||||||
|
key = key ^ (key >> 14)
|
||||||
|
key = (key + (key << 2)) + (key << 4) // key * 21
|
||||||
|
key = key ^ (key >> 28)
|
||||||
|
key = key + (key << 31)
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash64(ptr unsafe.Pointer, n, seed uintptr) uint64 {
|
||||||
|
h32 := hash32(ptr, n, seed)
|
||||||
|
return hash64finalizer((uint64(h32^xorshift32(uint32(seed))) << 32) | uint64(h32))
|
||||||
|
}
|
Загрузка…
Создание таблицы
Сослаться в новой задаче