用于在Java中创建通用哈希表的哈希函数(用于学习)

用于在Java中创建通用哈希表的哈希函数(用于学习),java,data-structures,hash,hashtable,Java,Data Structures,Hash,Hashtable,如果您正在用Java创建一个通用哈希表(假设它还没有),那么您将如何实现它的默认哈希函数?我知道您可以(通过接口)传入一个,但大多数数据结构都有默认值 我的尝试: 由于Java泛型需要引用类型,并且Java中的所有引用类型都实现hashCode(),因此我认为您可以使用T.hashCode()%backingArraySize作为哈希函数,这就足够了。毕竟,存储在哈希表中的任何类型的实现者都应该为其类型提供一个适当的hashCode()函数,对吗 有更好的方法吗?在我的哈希表实现中,当算法不是主

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

我的尝试:

由于Java泛型需要引用类型,并且Java中的所有引用类型都实现hashCode(),因此我认为您可以使用
T.hashCode()%backingArraySize
作为哈希函数,这就足够了。毕竟,存储在哈希表中的任何类型的实现者都应该为其类型提供一个适当的hashCode()函数,对吗


有更好的方法吗?

在我的哈希表实现中,当算法不是主题时,我决定使用普通的
hashCode()%backingarysize
(即您的建议);当算法不是主题时,我决定使用
hashCode()*2654435761
(常量取自)。E用于线性哈希实现。原因是许多默认的
hashCode()
实现不能很好地将值分布在整个
int
范围内(所有数字框类型,
String
List
),并且当键有某种偏差时,线性哈希可能会受到主要集群的影响。

定义得更好。实现哈希表的方法有很多(开放寻址、链接、存储桶类型等),并且有多种数据和分布,这可能导致不同的哈希函数需求。有趣的。。。为什么实施会很重要;无论是开放寻址还是链接,更少的冲突仍然更有效,对吗?为什么是通用的?由于所有类都实现了
hashCode()
,所以只需将参数
设为对象
,就可以使用它了。泛型(提供类型边界)没有任何作用。顺便说一下,
hashCode()
可以是负数,在这种情况下,
hashCode()%size
也可以是负数。