admin 发表于 2022-2-14 23:20:43

golang:使用murmur3生成随机hash值(整数值)

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


■实例代码
package main

import (
        "fmt"
        "github.com/spaolacci/murmur3"
)

func main() {
        originalStr := "www.golangcodes.com"

        // 注意:生成的hash值有三种取值,uint32,uint64,uint128,分别对应方法Sum32,Sum64,Sum128
        // 下面例子以Sum64为例

        // 1、使用默认种子,生成哈希值
        // 默认种子,其实是seed=0
        hValue1 := murmur3.Sum64([]byte(originalStr))
        fmt.Printf("hValue1 is %d\n", hValue1)
        // hValue1 is 3287451894060725215

        // 2、使用指定种子,生成哈希值
        seed := uint32(888)
        hValue2 := murmur3.Sum64WithSeed([]byte(originalStr), seed)
        fmt.Printf("hValue2 is %d\n", hValue2)
        // hValue2 is 14171841827472040358

        // 3、使用指定种子,生成哈希值,2的另一种写法
        h := murmur3.New64WithSeed(seed)
        h.Write([]byte(originalStr))
        hValue3 := h.Sum64()
        fmt.Printf("hValue3 is %d\n", hValue3)
        // hValue3 is 14171841827472040358

        // 如果使用h继续计算其他值,则需要首先调用Reset,引为write这里是追加写
        h.Reset()
        h.Write([]byte(originalStr))
        hValue4 := h.Sum64()
        fmt.Printf("hValue4 is %d\n", hValue4)
        // hValue4 is 14171841827472040358
}


页: [1]
查看完整版本: golang:使用murmur3生成随机hash值(整数值)