一些哈希表方案(例如cuckoo hashing或dynamic perfect hashing)依赖于存在通用哈希函数并能够通过从通用哈希函数族中选择新的哈希函数来解决具有冲突的数据集中的冲突。
前段时间,我试图在Java中实现一个使用cuckoo hashing支持的哈希表,但遇到了麻烦,因为尽管所有Java对象都有一个
起初,我认为可以通过直接将通用哈希函数应用于对象的
这似乎对Java的设计是有害的。这意味着
我的问题是:Java是否有理由考虑使用多个哈希函数对对象进行哈希而没有选择设计
前段时间,我试图在Java中实现一个使用cuckoo hashing支持的哈希表,但遇到了麻烦,因为尽管所有Java对象都有一个
hashCode
函数,但hashCode
返回的值对于每个对象都是固定的(除非对象发生改变)。这意味着,如果用户没有提供外部的通用哈希函数族,则无法构建依赖于通用哈希的哈希表。起初,我认为可以通过直接将通用哈希函数应用于对象的
hashCode
来解决这个问题,但这行不通,因为如果两个对象具有相同的hashCode
,则对这些哈希码应用任何确定性函数,即使是随机选择的哈希函数,也会导致相同的值,从而引起冲突。这似乎对Java的设计是有害的。这意味着
HashMap
和其他哈希容器完全禁止使用基于通用哈希的表,即使语言设计者认为这样的表在语言设计中是合适的。这也使得第三方库设计人员难以构建这种类型的哈希表。我的问题是:Java是否有理由考虑使用多个哈希函数对对象进行哈希而没有选择设计
hashCode
?我知道许多好的哈希方案,如链式哈希或二次探测,不需要它,但似乎这个决策使得很难在Java对象上使用某些类别的算法。
hashCode
接收一些位串,然后在生成哈希函数时进行解释。例如,如果您正在对整数进行哈希处理,您可以将位串视为一系列8位值,您可以使用这些值来扩大数字中的各个八位字节。 - templatetypedef