外部文件Java

时间:2017-05-26 00:37:14

标签: java hash hashtable randomaccessfile

我试图创建一个散列函数,以便将节点放到RandomAccessFile上。

我的节点大小是256字节。我读到的地方长度应该是总节点大小的两倍。我将在文件上放置1,000个节点,因此我选择了2,000个作为总大小。

我尝试使用此公式

int position = key.hashCode()& (2000 - 1)

但是我不断获得太小的位置来容纳节点。例如,当我打印我得到的位置时

位置521和524

但是我的节点是256字节,所以如果我要在521位写一个节点而在524处写另一个节点它们会重叠......对吗?

我已尝试使用stackoverflow和互联网上其他资源的一系列散列函数,但我找不到有效的函数。

1 个答案:

答案 0 :(得分:2)

如果您有1000个节点,则521和524表示256的倍数位置。实际位置(以字节为单位)通过将此数字乘以256或将其向左移动8来计算。

注意:使用& (x-1)的截断技巧仅在x为2的幂时起作用。由于2000不是2的幂,因此不能使用{{ 1}}截断你的哈希码。

这里有两个选项:

  • 改为使用& (2000 - 1),即%(注意负数)或
  • 使用2的下一个幂,即2048:key.hashCode() % 2000