admin 发表于 2022-3-14 00:43:12

golang:使用murmur3实现简单灰度策略

■实例说明
我们有时候想根据用户登录账号,实现一个灰度策略算法,比如,只有10%的用户可以怎么怎么样,这里我们使用murmur3 hash算法可以达到这个目的
1)hash算法有可能发生碰撞,即不同的输入转换出的hash值是一样的,好的算法当然发生碰撞的概率会很小。
2)murmur3算法是非加密哈希算法
   加密哈希函数旨在保证安全性,很难找到碰撞。即:给定的散列h很难找到的消息m;很难找到产生相同的哈希值的消息m1和m2。
   非加密哈希函数只是试图避免非恶意输入的冲突。作为较弱担保的交换,它们通常更快。如果数据量小,或者不太在意哈希碰撞的频率,甚至可以选择生成哈希值小的哈希算法,占用更小的空间。

■实例代码
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

}
页: [1]
查看完整版本: golang:使用murmur3实现简单灰度策略