复杂对象图的快速HashCode
我有一个非常复杂的对象 ,我需要获得这些对象的唯一性 。 可以通过重写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作为哈希码可能会使您更有可能获得哈希冲突,具体取决于所涉及的各个哈希值。 特别是,它使任何两个相等的字段“相互抵消”。 我通常使用这种forms:
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#学习教程:复杂对象图的快速HashCode分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013013.html