外部文件的哈希函数 Java

Hashing function for external file Java

我正在尝试创建一个散列函数,以便将节点放入 RandomAccessFile。

我的节点大小是 256 bytes.I 在某处读到长度应该是总节点大小的两倍。我将在文件中放置 1,000 个节点,因此我选择 2,000 作为总大小。

我试过使用这个公式

整数位置 = key.hashCode() & (2000 - 1)

但我总是得到太小而无法容纳节点的位置。例如,当我打印我得到的位置时

位置 521 和 524

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

我尝试了来自 Whosebug 和互联网上其他资源的一系列散列函数,但我找不到一个有效的函数。

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

注意:使用& (x-1)的截断技巧仅在x是2的幂时有效。由于2000不是2的幂,您不能使用 & (2000 - 1) 来截断您的哈希码。

这里有两个选择:

  • 改用%,即key.hashCode() % 2000(注意负数),或者
  • 使用 2 的次方,即 2048:key.hashCode() & (2048 - 1)