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]