是,对于每一个不同的对象的最有效的方法返回的值不同一个hashCode()方法?

问题描述 投票:3回答:5

据我所知,每个对象返回相同的数值是低效率的,但它是最有效的方法,为不同的情况下返回不同的值?

如果每个对象都有不同的哈希码值那么是不是这就像将它们存储在一个ArrayList?

java hashcode
5个回答
3
投票

不,它实际上不是。

假设你的对象将被存储到一个HashMap(或设置......没关系,我们将在这里用HashMap简单),你希望你的hashCode方法,以在尽可能均匀分布的对象的方式返回结果成为可能。

哈希码应该是不相等的对象唯一,但你不能保证这将永远是正确的。在另一方面,如果a.equals(b)是真的,那么a.hashCode() == b.hashCode()。这就是所谓的Object Contract

除此之外,也有性能问题也。每当两个不同的对象有相同的hashCode,他们映射到HashMap中(又名,他们碰撞)相同的位置。这意味着,HashMap的实现必须处理这种冲突,这比简单地存储和检索条目要复杂得多。

也有大量的依赖于一个事实,即值跨地图分布均匀算法,当碰撞数量的增加(一些算法假定一个完美的哈希函数,这意味着没有冲突不断发生,没有两个不同的性能迅速恶化值被映射到在地图上的同一位置)。

就是很好的例子是概率算法和数据结构,例如Bloom Filters(使用,似乎是在时尚这些天的一例)。


4
投票

hashCode必须与equals一致,这是首要任务。如果没有两个对象是相等的,那么这将是可取的。记住,如果你的对象有任何国家的超过32位,这在理论上是不可能提供一个完美的传播哈希码。


1
投票

你想hashCode()方法的多样化,尽量避免碰撞。如果没有冲突,每个键或元件将存储在其自身的底层数组英寸(像一个ArrayList A位)

问题是,即使hashCode()方法是不同的,你仍然可以得到碰撞。这是因为你不必为每一个可能的hashCode水桶,并且这个值必须降低到一个较小的范围内。例如你有16桶,范围为0〜15它是如何,这是复杂的,但我相信你可以看到,即使所有的散列码是不同的,他们仍然可以导致碰撞(尽管它不太可能)

这是一个拒绝服务攻击的担忧。通常字符串具有较低的碰撞率,但你可以故意构造一个具有相同的哈希码字符串。这个问题可以让字符串以0 Why doesn't String's hashCode() cache 0?的哈希代码列表


0
投票

哈希码()方法是不适合于放置在对象的ArrayList。尽管它每次都返回相同的值相同的对象,两个对象可能很可能具有相同的哈希码。

因此存储例如一个HashMap项时hashCode方法是在密钥对象中。


0
投票

HashMap类的主要数据结构是这样的:

Entry[] table;

需要注意的是入门级的(这是一个静态包保护类,它实现了Map.Entry)实际上是一个链表式结构是很重要的。

当您尝试将一个元素,第一个关键的哈希码进行计算,然后转化成桶数目。的“桶”是索引到上述阵列。

一旦你找到了水桶,线性搜索该桶的内部完成的确切键(如果你不相信我,看看HashMap的代码)。如果发现,该值被替换。如果不是,则键/值对被附加到该桶的端部。

出于这个原因,hashCode()方法的值不必是唯一的,但是,更独特,更均匀地分布它们,更好的赔率是有桶之间均匀分布的值。如果你的hashCode()方法的方法对所有实例返回相同的值,他们会都结束了在同一个桶,从而使你的get()方法是一个漫长的线性搜索,得到O(N)

所述多个分布式的值,较小的桶,并且因此较小的线性搜索组件会。唯一值将产生恒定的时间查找O(1)。

© www.soinside.com 2019 - 2024. All rights reserved.