【发布时间】:2014-10-30 08:53:35
【问题描述】:
我正在编写一个类,该类需要基于其两个字段具有唯一哈希码,我想知道异或这两个字段哈希码是否足以为我的对象生成唯一且一致的哈希码?
class _TypeMatch{
final Type _potentialSubtype;
final Type _supertype;
int _cachedHashCode;
_TypeMatch(this._potentialSubtype, this._supertype){
_cachedHashCode = _potentialSubtype.hashCode ^ _supertype.hashCode;
}
int get hashCode => _cachedHashCode;
bool operator ==(other){
return other is _TypeMatch && _cachedHashCode == other._cachedHashCode;
}
}
我已经看到这个问题here 这似乎表明异或两个其他哈希码是正确的做法,但它们首先将每个哈希码乘以 2 个大素数,我不确定为什么或是否有必要这样做。我主要关心的是 A 和 B 两种类型:
new _TypeMatch(A, B) == new _TypeMatch(A, B) // is true for all A and B
并且组合哈希的计算尽可能高效,因为创建新的 _TypeMatch 将成为系统的核心部分,因此整个系统都会严重感受到任何性能低效。
更新
哈希码例如在哈希图或哈希表中用于将存储的键/值平均分配到“槽”中。一个槽可以包含许多键/值,但通过使用哈希码,可以轻松快捷地在映射中找到一个槽,并从那里在更小的一组值中查找具体的键/值。无论键使用哪种数据类型,这都可以非常快地提高在地图中搜索的速度。当存储的键/值的哈希码发生变化时,无法再通过键检索该值。
您可以只使用1 作为每个对象的哈希码,但这会破坏性能。
您会通过良好的分布(不同对象的不同哈希码)获得相反的效果(最佳性能),但有一个限制。例如,当您使用 32 位整数类型作为哈希码时,可能的哈希码数量是有限的。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Hash_table。
不过,还有更多的哈希用例。
【问题讨论】:
-
你说的独特是什么意思?哈希码不应该是唯一的。不过,它不会改变很重要。相等的对象应该返回相同的哈希码,但这并不意味着不同的对象需要有不同的哈希码。你不应该使用 hashCode 来检查相等性。
-
如果不检查唯一性/相等性,哈希码的目的是什么?我认为 1.hashCode == 1.hashCode 和 "yo".hashCode == "yo".hashCode 一样是真的
-
我的英语很烂,而且我的句子很冗长,因此我的 cmets 对于评论字段来说往往变得太长 ;-)。我更新了我的答案。
-
一个哈希码应该用于相等或标识,但不能同时使用;平等和身份是两个不同的属性。