4

我有一个非常复杂的对象,我需要获得这些对象的唯一性。一种解决方案可以通过覆盖来完成GetHashCode()。我已经实现了下面提到的代码:

public override int GetHashCode()
{
    return this._complexObject1.GetHashCode() ^
           this._complexObject2.GetHashCode() ^
           this._complexObject3.GetHashCode() ^
           this._complexObject4.GetHashCode() ^
           this._complexObject5.GetHashCode() ^
           this._complexObject6.GetHashCode() ^
           this._complexObject7.GetHashCode() ^
           this._complexObject8.GetHashCode();
}

这些复杂的对象也覆盖 GetHashCode()并执行类似的操作

我的项目需要这些对象的唯一性,我经常处理这些对象,并且内部的数据也以各种方式和地点发生变化

我需要一种更快的方法来找到这些复杂对象的唯一性,这需要考虑性能内存

在此先感
谢穆尼姆

4

1 回答 1

10

鉴于您的评论,听起来您可能正试图依靠 GetHashCode自己来确定唯一性。不要那样做。散列并不意味着是唯一的——这意味着两个不相等的对象不太可能散列到相同的值,但并非不可能。如果您尝试检查一组对象是否没有重复项,则必须使用 Equals。

请注意,对哈希码使用 XOR 会使您更有可能遇到哈希冲突,具体取决于所涉及的各个哈希值。特别是,它使任何两个相等的字段“相互抵消”。我一般使用这种形式:

int hash = 17;
hash = hash * 31 + field1.GetHashCode();
hash = hash * 31 + field2.GetHashCode();
hash = hash * 31 + field3.GetHashCode();
hash = hash * 31 + field4.GetHashCode();
...
return hash;

...但即便如此,这肯定不能保证唯一性。您应该使用GetHashCode()来排除相等性,然后使用Equals来检查任何潜在相等值的实际相等性。

现在您的问题提到了速度 - 这听起来像是使用分析器和一些基准测试的理想场所。你确定这是一个瓶颈?如果您有许多不同类型的所有计算哈希值,您是否发现其中哪一个是问题的最大贡献者?

一些优化将取决于您如何使用数据。如果您发现您的大量时间都花在重新计算您知道未更改的值的哈希值上,您可以缓存哈希代码......尽管当存在本身引用复杂对象的字段时,这显然变得更加棘手。您可以缓存“叶节点”哈希,特别是如果这些叶节点不经常更改(但它们的用法可能会有所不同)。

于 2010-01-14T07:19:48.863 回答