我有一个非常复杂的对象,我需要获得这些对象的唯一性。一种解决方案可以通过覆盖 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()
并执行类似操作。
我的项目需要这些对象的唯一性,我经常处理这些对象,并且内部数据也以各种方式变化和地点。
我需要一种更快的方法来找到这些复杂对象的唯一性,这需要考虑性能和内存。
提前致谢
穆尼姆
最佳答案
鉴于您的评论,听起来您可能试图自己依赖 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
检查任何潜在相等值的实际相等性。
现在您的问题提到了速度 - 这听起来像是使用分析器和一些基准测试的完美场所。你确定这是瓶颈吗?如果您有许多不同类型的所有计算哈希值,您是否发现其中哪一个是问题的最大贡献者?
一些优化将取决于您如何使用数据。如果你发现你的很多时间都花在重新计算你知道没有改变的值的散列上,你可以缓存散列码......虽然当有自己引用复杂对象的字段时这显然变得更加棘手。您可以缓存“叶节点”哈希值,特别是如果这些叶节点不经常更改(但它们的用法可能会有所不同)。
关于c# - 复杂对象图的快速哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2062596/