Csharp/C#教程:复杂对象图的快速HashCode分享


复杂对象图的快速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

(0)
上一篇 2021年12月30日
下一篇 2021年12月30日

精彩推荐