【发布时间】:2017-03-01 03:44:45
【问题描述】:
我正在尝试在 Java 中实现一个简单的FNV 哈希函数。该函数需要值 2166136261 作为函数参数。在一个online source中,十六进制数分配如下:
private static final int FNV_32_INIT = 0x811C9DC5;
但我认为这是不正确的,因为 2166136261 大于 2147483647,这是 int 可以容纳的最大值。
我是否正确地假设我至少需要一个 long 类型的变量才能存储值,无论是十进制还是十六进制?
编辑:
该算法中用作偏移基础的值是任意的,因此无论是 FNV_32_INIT = 2166136261 还是其他值都没有关系:
关于 offset_basis 值:
从 FNV-0 切换到 FNV-1 纯粹是为了改变 offset_basis 为非零值。该非零值的选择是 随意的。使用了字符串: chongo /../\ 因为测试人员正在查看一封来自 Landon 的电子邮件 Landon 的标准电子邮件签名行。其实做的人 那没看得很清楚。今天,Landon 使用 () 代替 并且他的 ASCII 蝙蝠使用“oo”眼睛而不是“..”,如:chongo (Landon Curt Noll) /\oo/\ 我们没有费心纠正她的错误,因为它 不要紧。在一般情况下,几乎任何 offset_basis 都会 只要它是非零的就发球。
【问题讨论】:
-
我是否正确假设我至少需要一个 long 类型的变量才能存储值,无论是十进制还是十六进制? 是乙>。并且你添加一个
L来表示常量值是一个long;long hex = 0x811C9DC5L;。并且值是正确的,当你理解 overflow. -
@Elliott 所以网上的来源有误?
-
我会假设在线资源理解溢出。
-
网上的资料似乎没有声称 0x811C9DC5 等于 2166136261。
-
我在源代码中没有看到评论。但如果他们不使用
2166136261,为什么他们认为-2128831035在散列函数中的行为相同?哈希函数指定2166136261。
标签: java hash int long-integer