Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复杂对象图的快速哈希代码_C#_.net_Performance_Hash Code Uniqueness - Fatal编程技术网

C# 复杂对象图的快速哈希代码

C# 复杂对象图的快速哈希代码,c#,.net,performance,hash-code-uniqueness,C#,.net,Performance,Hash Code Uniqueness,我有一个非常复杂的对象,我需要得到这些对象的唯一性。一种解决方案是重写GetHashCode()。我已经实现了以下代码: public override int GetHashCode() { return this._complexObject1.GetHashCode() ^ this._complexObject2.GetHashCode() ^ this._complexObject3.GetHashCode() ^

我有一个非常复杂的对象,我需要得到这些对象的唯一性。一种解决方案是重写
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()
,并执行类似的操作

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

我需要一个更快的方法来找到这些复杂对象的唯一性,需要考虑<强>性能>和<强>内存< /强> .< 提前感谢


Munim

根据您的评论,听起来您可能试图依靠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
检查任何潜在相等值的实际相等性

现在你的问题提到了速度——这听起来是使用分析器和一些基准测试的完美地方。你确定这是个瓶颈吗?如果您有许多不同类型的所有计算散列值,您是否发现了其中哪一个是问题的最大原因


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

如果数据正在更改,
GetHashCode()
可能是错误的开始-此外,它只能保证非相等性(不能用于测试相等性)。谢谢Marc,我不是为了测试相等,而是使用
GetHashCode()
来检查对象是否不相等,这就是我需要做的,只是想检查一下。不过,我不确定有没有魔杖的答案。您可能可以通过缓存值并在发生更改时删除缓存的值来做一些事情,但在复杂的图形中这是很棘手的(因为您需要检查所有的子对象)。