Inproc和Stateserver会话变量的GetHashCode的不同值
我最近继承了一个非常大量使用会话的应用程序,包括在会话中存储大量自定义数据对象。我使用该应用程序的首要业务之一是至少将会话数据从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))。