本机库具有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-fold

package main

import (
    "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

这是对的吗?

最佳答案

这是对的吗?

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

hash = hash % 9223372036854775808

XOR折叠的分布是可疑的,可能在某处被证明,但不是立即显而易见。但是,模数显然是将散列算法的分布包装到较小的共域中。

关于postgresql - Golang中的改进FNV-1哈希算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33295624/

10-10 10:09