本机库具有返回uint64值的FNV-1哈希算法https://golang.org/pkg/hash/fnv/(范围: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
这是对的吗?
答案 0 :(得分:2)
这是对的吗?
是的,它是正确的XOR折叠到63位。但是有一个更简单的方法:
hash = hash % 9223372036854775808
XOR折叠的分布是可疑的,可能在某处证明,但不是很明显。然而,Modulo显然是将哈希算法的分布包含在较小的密码域中。