golang代码实例库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3310|回复: 0

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

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
486
发表于 2022-3-14 00:43:12 | 显示全部楼层 |阅读模式
实例说明
我们有时候想根据用户登录账号,实现一个灰度策略算法,比如,只有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

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|golang代码实例库 ( 粤ICP备2021162396号 )

GMT+8, 2024-11-3 04:27 , Processed in 0.016073 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表