我正在尝试创建一个哈希函数,以便将节点放置到 RandomAccessFile 上。
我的节点大小是 256 字节。我在某处读到长度应该是总节点大小的两倍。我将在文件中放置 1,000 个节点,因此我选择 2,000 作为总大小。
我尝试使用这个公式
int 位置 = key.hashCode() & (2000 - 1)
但是我不断得到的位置太小而无法容纳节点。例如,当我打印我得到的位置
位置 521 和 524
但是我的节点是 256 字节,因此如果我在位置 521 处写入一个节点,在位置 524 处写入另一个节点,它们会重叠...对吗?
我尝试了 stackoverflow 和互联网上其他资源中的一系列哈希函数,但找不到有效的函数。
最佳答案
如果有 1000 个节点,则 521 和 524 表示 256 倍数的位置。实际位置(以字节为单位)是通过将此数字乘以 256 或左移 8 来计算的。
注意:使用 & (x-1)
的截断技巧仅在 x
是 2 的幂时才起作用。自 2000 年以来不是 2 的幂,您不能使用 & (2000 - 1)
截断哈希码。
这里有两个选择:
- 使用
%
代替,即key.hashCode() % 2000
(注意负数),或 - 使用 2 的下一个幂,即 2048:
key.hashCode() & (2048 - 1)
关于java - Java外部文件的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191804/