有时候我们想给map分散到不同切片中,需要根据某个key算出自定义区间
Murmur3 哈希算法 ,比md5快10倍速度
package mycachego
import (
"github.com/spaolacci/murmur3"
"testing"
)
func Test_index(t *testing.T) {
res := indexOf("xuzasdasdansdf") & (49 - 1)
t.Log(indexOf("xuzansdf"), res)
}
func indexOf(key string) int {
index := 1469598103934665603
keyBytes := []byte(key)
for _, b := range keyBytes {
index = (index << 5) - index + int(b&0xff)
index *= 1099511628211
}
return index
}
func BenchmarkMurmur3(b *testing.B) {
for i := 0; i < b.N; i++ {
res2 := murmur3.Sum32([]byte("xxxxx")) % uint32(256)
_ = res2
}
}
func BenchmarkIndexOf(b *testing.B) {
for i := 0; i < b.N; i++ {
res := indexOf("xxxxx") & (256 - 1)
_ = res
}
}
func BenchmarkFnv32(b *testing.B) {
for i := 0; i < b.N; i++ {
res := fnv32("xxxxx") % uint32(256)
_ = res
}
}
func TestFnv32(t *testing.T) {
res := fnv32("sdfsd") % uint32(256)
t.Log(res)
}
func fnv32(key string) uint32 {
hash := uint32(2166136261)
const prime32 = uint32(16777619)
for i := 0; i < len(key); i++ {
hash *= prime32
hash ^= uint32(key[i])
}
return hash
}
测试结果
Murmur3算法还是快了一倍