【问题标题】:Hash function for creating a generic hash table in Java (for learning purposes)用于在 Java 中创建通用哈希表的哈希函数(用于学习目的)
【发布时间】:2014-05-26 15:36:31
【问题描述】:

如果您要在 Java 中创建一个通用哈希表(假设它还没有),那么您将如何实现其默认哈希函数?我知道你可以传入一个(通过接口),但大多数数据结构都有默认值。

我的尝试:

由于 Java 泛型需要引用类型,并且 Java 中的所有引用类型都实现 hashCode(),我认为您可以只使用 T.hashCode() % backingArraySize 作为哈希函数,这样就足够了。毕竟,你可以存储在哈希表中的任何类型的实现者都应该给他们的类型一个合适的 hashCode() 函数,对吧?

有更好的方法吗?

【问题讨论】:

  • 定义更好。实现哈希表的方法有很多种(开放寻址、链接、桶的种类等),并且有多种数据和分布可能导致不同的哈希函数要求。
  • 有趣...为什么实施很重要?无论您是开放寻址还是链接,更少的冲突仍然更有效,对吧?
  • 为什么是通用的?由于所有类都实现了hashCode(),因此只需设置参数Object 即可。泛型(提供类型边界)没有任何作用。
  • 顺便说一下,hashCode() 可以是负数,那么hashcode() % size 也可以是负数。

标签: java data-structures hash hashtable


【解决方案1】:

在我的哈希表实现中,当算法不是primary clusteringhashCode() * 2654435761(常量取自this answer)的主题时,我决定使用普通的hashCode() % backingArraySize(即你的建议),一世。 e.用于线性哈希实现。原因是许多默认的hashCode() 实现不会在整个int 范围内很好地分配值(所有数字盒装类型,StringList),并且当键以某种方式存在偏差时,线性散列可能会受到主要影响聚类。

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 2018-05-20
    • 2020-11-23
    • 2010-12-04
    • 2015-10-06
    • 2018-08-26
    • 1970-01-01
    • 2013-12-20
    • 2011-04-20
    相关资源
    最近更新 更多