java - Java外部文件的哈希函数

标签 java hash hashtable randomaccessfile

我正在尝试创建一个哈希函数,以便将节点放置到 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/

相关文章:

java - 如何将 MessageDigest 内部状态保存到数据库中?

c - 遍历后表被删除

java - Log4j 在基类中创建日志实例

java - 在 Java 中将 32 位 float 分配给 4 个整数(RGBA)

java - CAS 身份验证后获取 JSF Managed Bean 中的 LDAP 属性

java - 条件等于的 HashCode

php - PHP 基于 token 的身份验证

java - 如何解决-java.lang.IncompatibleClassChangeError?

c# - 如何检查 Hashtable 值是否全为 0?

c++ - HashTable 实现 Get 和 Set 运算符重载