为了账号安全,请及时绑定邮箱和手机立即绑定

golang 中修改的 FNV-1 哈希算法

golang 中修改的 FNV-1 哈希算法

Go
慕丝7291255 2021-11-15 20:51:14
本机库具有 FNV-1 哈希算法https://golang.org/pkg/hash/fnv/返回 uint64 值(范围:0 到 18446744073709551615)。我需要将此值存储在 PostgreSQL bigserial 中,但它的范围是 1 到 9223372036854775807。可以将哈希大小更改为例如。56?http://www.isthe.com/chongo/tech/comp/fnv/index.html#xor-fold有人可以帮助更改本机算法以生成 56 位哈希吗? https://golang.org/src/hash/fnv/fnv.go更新我自己使用这个文档http://www.isthe.com/chongo/tech/comp/fnv/index.html#xor-foldpackage mainimport (    "fmt"    "hash/fnv")func main() {    const MASK uint64 = 1<<63 - 1    h := fnv.New64()    h.Write([]byte("1133"))    hash := h.Sum64()    fmt.Printf("%#x\n", MASK)    fmt.Println(hash)    hash = (hash >> 63) ^ (hash & MASK)    fmt.Println(hash)}http://play.golang.org/p/j7q3D73qqu这是正确的吗?
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

这是正确的吗?

是的,这是对 63 位的正确 XOR 折叠。但是有一个更简单的方法:

hash = hash % 9223372036854775808

XOR 折叠的分布是可疑的,可能在某处得到了证明,但不是很明显。然而,Modulo 显然是将散列算法的分布包装到一个较小的 codomain。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 379 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信