■实例说明
我们有时候想根据用户登录账号,实现一个灰度策略算法,比如,只有10%的用户可以怎么怎么样,这里我们使用murmur3 hash算法可以达到这个目的
1)hash算法有可能发生碰撞,即不同的输入转换出的hash值是一样的,好的算法当然发生碰撞的概率会很小。
2)murmur3算法是非加密哈希算法
加密哈希函数旨在保证安全性,很难找到碰撞。即:给定的散列h很难找到的消息m;很难找到产生相同的哈希值的消息m1和m2。
非加密哈希函数只是试图避免非恶意输入的冲突。作为较弱担保的交换,它们通常更快。如果数据量小,或者不太在意哈希碰撞的频率,甚至可以选择生成哈希值小的哈希算法,占用更小的空间。
■实例代码
[Golang] 纯文本查看 复制代码 package main
import (
"fmt"
"math"
"github.com/spaolacci/murmur3"
)
const (
grayRatio = 0.1 // 灰度比率:0.1,即10%用户会被灰度到
)
// IsGrayUser 是否灰度用户
func IsGrayUser(id string) bool {
if grayRatio >= 1.0 {
return true
} else if grayRatio <= 0 {
return false
}
// 使用默认种子,生成哈希值
// 相同的id,每次生成的hash值是固定的,可以保证用户每次进来状态一致
hashValue := murmur3.Sum32([]byte(id))
fmt.Printf("hashValue is %d\n", hashValue)
// murmur3.Sum32最大值为:math.MaxUint32
// 如果哈希值小于按最大值乘以灰度比率出来的结果,则算灰度用户
if float64(hashValue) <= float64(math.MaxUint32)*grayRatio {
return true
}
return false
}
func main() {
for i := 0; i <= 100; i++ {
id := fmt.Sprintf("user_%d", i)
g := IsGrayUser(id)
fmt.Printf("%s is gray user:%+v\n", id, g)
}
//……
//hashValue is 209049943
//user_96 is gray user:true
//hashValue is 4097235372
//user_97 is gray user:false
}
|