我试图创建一个散列函数,以便将节点放到RandomAccessFile上。
我的节点大小是256字节。我读到的地方长度应该是总节点大小的两倍。我将在文件上放置1,000个节点,因此我选择了2,000个作为总大小。
我尝试使用此公式
int position = key.hashCode()& (2000 - 1)
但是我不断获得太小的位置来容纳节点。例如,当我打印我得到的位置时
位置521和524
但是我的节点是256字节,所以如果我要在521位写一个节点而在524处写另一个节点它们会重叠......对吗?
我已尝试使用stackoverflow和互联网上其他资源的一系列散列函数,但我找不到有效的函数。
答案 0 :(得分:2)
如果您有1000个节点,则521和524表示256的倍数位置。实际位置(以字节为单位)通过将此数字乘以256或将其向左移动8来计算。
注意:使用& (x-1)
的截断技巧仅在x
为2的幂时起作用。由于2000不是2的幂,因此不能使用{{ 1}}截断你的哈希码。
这里有两个选项:
& (2000 - 1)
,即%
(注意负数)或key.hashCode() % 2000