我有一个漂亮的复杂的物体我需要得到独特性这些物体。一种解决方案可以通过重写来完成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()
并且确实类似的操作.
我的项目需要这些对象的唯一性,我处理这些对象非常频繁地,还有里面的数据changes in 各种方式和地点.
我需要一种更快的方法来找到这些复杂对象的唯一性,这需要考虑表现 and memory.
提前致谢
Munim
鉴于您的评论,听起来您可能正在尝试依赖 GetHashCode在其自己的来确定唯一性。不要那样做。哈希值不是meant独一无二——这是注定的unlikely两个不相等的对象将散列到相同的值,但并非不可能。如果您尝试检查一组对象是否没有重复项,您将have也可以使用等于。
请注意,对哈希码使用 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()
统治out相等,然后使用Equals
检查任何潜在相等值的实际相等性。
现在你的问题提到了速度 - 这听起来像是使用分析器和一些基准测试的完美场所。你确定这是一个瓶颈吗?如果您有许多不同的类型都在计算哈希值,您是否发现其中哪一个是导致问题的最大因素?
一些优化将取决于您如何使用数据。如果您发现大量时间花费在重新计算您知道未更改的值的哈希值上,则可以缓存哈希代码...尽管当存在本身引用复杂对象的字段时,这显然会变得更加棘手。您可以缓存“叶节点”哈希值,特别是如果这些叶节点不经常更改(但它们的用法可能会有所不同)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)