dart,对两个哈希代码进行异或总是会返回一个新的唯一哈希代码吗?

dart,对两个哈希代码进行异或总是会返回一个新的唯一哈希代码吗?,dart,hashcode,Dart,Hashcode,我正在编写一个类,该类需要一个基于其两个字段的唯一hashcode,我想知道对这两个字段的hashcode进行XORing是否足以为我的对象生成唯一且一致的hashcode class\u类型匹配{ 最终类型_潜在亚型; 最终类型_超类型; int_cachedHashCode; _类型匹配(此.\u潜在子类型,此.\u超类型){ _cachedHashCode=\u potentialSubtype.hashCode^\u supertype.hashCode; } int get hashC

我正在编写一个类,该类需要一个基于其两个字段的唯一hashcode,我想知道对这两个字段的hashcode进行XORing是否足以为我的对象生成唯一且一致的hashcode

class\u类型匹配{
最终类型_潜在亚型;
最终类型_超类型;
int_cachedHashCode;
_类型匹配(此.\u潜在子类型,此.\u超类型){
_cachedHashCode=\u potentialSubtype.hashCode^\u supertype.hashCode;
}
int get hashCode=>\u cachedHashCode;
布尔运算符==(其他){
返回other is_TypeMatch&&u cachedHashCode==other.\u cachedHashCode;
}
}
我看到了这个问题,它似乎表明,对另外两个哈希代码进行XOR运算是正确的做法,但它们首先将每个哈希代码多复制两个大素数,我不知道为什么或者是否有必要这样做。我主要关心的是,对于两种类型A和B:

new _TypeMatch(A,B)==new _TypeMatch(A,B)//对所有A和B都是真的
组合散列的计算尽可能高效,因为创建一个新的类型匹配将是系统的核心部分,因此整个系统都会感觉到性能的低效

更新 例如,在hashmap或hashtable中使用hashcode将存储的键/值平均分配到“插槽”中。一个槽可以包含许多键/值,但通过使用hashcode,可以轻松快速地在映射中找到一个槽,然后在更小的值集中查找具体的键/值。这提高了在地图中快速搜索的速度,无论密钥使用何种数据类型。当存储的键/值的哈希代码发生更改时,该值将无法再通过键检索。 您可以将
1
用作每个对象的哈希代码,但这会破坏性能。 良好的分布(不同对象使用不同的哈希代码)会产生相反的效果(最佳性能),但有一个限制。例如,当您为哈希代码使用32位整数类型时,可能的哈希代码数量是有限的。 有关更多详细信息,请参阅。
不过,哈希还有更多的用例。

我建议使用quiver包中的
hash2
方法

你可以像这样使用它

import'包:quiver/core.dart'显示hash2;
@凌驾
int get hashCode=>hash2(val1,val2);
他们使用此代码组合哈希代码

int\u组合(int散列,int值){
散列=0x1ffffff&(散列+值);
hash=0x1ffffff&(hash+((0x0007ffff&hash)>6);
}
更新

(摘自我在问题下方的评论)


hashcode
不应该是唯一的。但是它不改变很重要。相等的对象应该返回相同的hashcode,但这并不意味着不同的对象需要不同的hashcode。你不应该使用hashcode来检查相等性。

你说的唯一是什么意思?hashcode不应该是唯一的但是,它不改变很重要。相等的对象应该返回相同的hashcode,但这并不意味着不同的对象需要不同的hashcode。不应该使用hashcode检查相等性。如果不检查唯一性/相等性,hashcode的用途是什么?我认为1.hashcode==1.hashcode是真的正如“yo”一样。hashCode==“yo”。hashCode我的英语很烂,我的句子也很冗长,因此我的评论对于评论栏来说太长了;-)。我更新了我的答案,一个hashcode应该用于相等或标识,但不能同时用于两者;平等和身份是两个不同的属性。正如甘特在他对原始问题的评论中所解释的那样,
hashCode
契约并不要求对象的哈希代码是唯一的,只要求相互之间
=
的两个对象必须具有相同的
hashCode
。如果您需要唯一的散列码,您不应该依赖Dart内置的
hashCode
s,而是使用自己的散列码来确保唯一性。