golang代码实例库

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

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

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

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


实例代码
[Golang] 纯文本查看 复制代码
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
}


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 09:43 , Processed in 0.016117 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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