Java 如何确保/强制HashMap中的分布相等?

Java 如何确保/强制HashMap中的分布相等?,java,data-structures,hash,hashmap,Java,Data Structures,Hash,Hashmap,HashMap数据结构基于密钥的哈希代码在其存储桶之间分配密钥。大多数情况下,如果哈希算法非常好,所有密钥都将分布在不同的存储桶中。但是如果所有键都返回相同的哈希代码呢?插入/检索操作的顺序为O(n) 如果我正在实现我自己的HashMap,我将如何(或者应该怎么做)确保桶之间的平均分布?有办法吗 但是如果所有键都返回相同的哈希代码呢 那么你输掉了比赛,对此你无能为力 不过,不用担心,因为您的数据结构真的不关心—您的数据结构的用户可能会关心,但在第一种情况下,他们是负责病态的hashCode实现的

HashMap数据结构基于密钥的哈希代码在其存储桶之间分配密钥。大多数情况下,如果哈希算法非常好,所有密钥都将分布在不同的存储桶中。但是如果所有键都返回相同的哈希代码呢?插入/检索操作的顺序为O(n)

如果我正在实现我自己的HashMap,我将如何(或者应该怎么做)确保桶之间的平均分布?有办法吗

但是如果所有键都返回相同的哈希代码呢

那么你输掉了比赛,对此你无能为力

不过,不用担心,因为您的数据结构真的不关心—您的数据结构的用户可能会关心,但在第一种情况下,他们是负责病态的
hashCode
实现的人


从理论上讲,即使恶意选择的输入值也可以合理地均匀分布,但在Java中,这确实不是一个选项。

在键上运行类似DES的操作来生成哈希。一个像样的加密算法保证结果看起来是随机的。

从什么生成哈希?在Java中,
HashMap
的使用者,而不是数据结构的作者,可以选择
hashCode()
实现。您可以随机化哈希的生成,但这会在检索中造成真正的问题。我可以创建一个由树映射数组支持的哈希映射。这样,我就可以依靠密钥的可比性来进行插入/检索(希望在Log(n)中完成所有这一切)。但这只是将问题推迟到可比函数。有没有一个数学函数可以替代?或者其他一些设计模式?为什么会在检索上产生问题?该键总是散列到相同的值。