Inproc和Stateserver会话变量的GetHashCode的不同值

时间:2020-03-05 18:59:46  来源:igfitidea点击:

我最近继承了一个非常大量使用会话的应用程序,包括在会话中存储大量自定义数据对象。我使用该应用程序的首要业务之一是至少将会话数据从InProc中移出,并将其卸载到状态服务器或者SQL Server中。

在使所有适当的数据对象可序列化并将web.config更改为使用状态服务后,一切似乎都可以正常工作。

但是,我发现此应用程序使用GetHashCode()进行了大量对象比较。在会话为InProc时可以正常工作的方法不再起作用,因为HashCodes在应有的时候不再匹配。当我们知道子对象的原始哈希码时,尝试从父对象中查找特定的子对象时,情况似乎就是这样。

如果我只是简单地将web.config更改回使用inproc,它将再次起作用。

任何人都从哪里开始有任何想法?

编辑:

qbeuek:感谢快速回复。关于:

The default implementation of GetHashCode in Object class return a hash value based on objects address in memory or something similar. If some other identity comparison is required, you have to override both Equals and GetHashCode.

我应该提供更多有关他们如何使用它的信息。基本上,它们具有一个父数据对象,并且有多个子对象数组。他们碰巧知道他们需要的特定对象的哈希码,因此他们在子对象的特定数组中循环查找匹配的哈希码。一旦找到匹配项,他们便将该对象用于其他工作。

解决方案

回答

在称为该方法的类中重写GetHashCode方法,并根据唯一的对象属性(例如ID或者所有对象字段)计算哈希码。

回答

当你写

does a lot of object comparisons using GetHashCode()

我觉得这段代码有些可怕的错误。 GetHashCode方法不能保证,给定两个不同的对象,返回的哈希值无论如何都应该是唯一的。就GetHashCode而言,它可以为所有对象返回0,仍然被认为是正确的。

当两个对象相同时(Equals方法返回true),它们必须具有从GetHashCode返回的相同值。当两个对象具有相同的哈希值时,它们可以是同一对象(Equals返回true),也可以是不同的对象(Equals返回false)。

GetHashCode的结果没有其他保证。

Object类中GetHashCode的默认实现基于内存或者类似对象中的对象地址返回哈希值。如果需要进行其他身份比较,则必须同时覆盖Equals和GetHashCode。

回答

解决方案1:为所有子对象创建唯一的ID,并使用该ID代替哈希码。

解决方案2:将if(a.GetHashCode()== b.GetHashCode())替换为if(a.Equals(b))。