我最近继承了一个非常大量使用会话的应用程序,包括在会话中存储大量自定义数据对象。我使用此应用程序的第一个业务点之一是至少将会话数据从InProc移开,并将其卸载到状态服务器或SQL Server。
在我将所有适当的数据对象序列化后,并将web.config更改为使用状态服务后,一切似乎都正常。
但是,我发现这个应用程序使用GetHashCode()进行了大量的对象比较。在会话是InProc时工作正常的方法不再有效,因为HashCodes在它们应该的时候不再匹配。当您知道子对象的原始哈希码时,尝试从父级查找特定子对象时,似乎就是这种情况
如果我只是将web.config更改回使用inproc,它会再次运行。
任何人都对从何处开始有任何想法?
编辑:
qbeuek:谢谢你的快速回复。关于:
Object类中的GetHashCode的默认实现根据内存中的对象地址或类似内容返回一个哈希值。如果需要进行其他身份比较,则必须覆盖Equals和GetHashCode。
我应该提供更多关于他们如何使用它的信息。基本上,它们有一个父数据对象,并且有几个子对象数组。他们碰巧知道他们需要的特定对象的哈希码,因此他们循环遍历特定的子对象数组,寻找匹配的哈希码。找到匹配后,他们就会将该对象用于其他工作。
答案 0 :(得分:2)
写作时
使用GetHashCode()
进行大量对象比较
我觉得这段代码有些可怕的错误。 GetHashCode方法不保证在给定两个不同对象的情况下返回的哈希值应该是唯一的唯一方式。就GetHashCode而言,它可以为所有对象返回0并仍被认为是正确的。
当两个对象相同时(Equals方法返回true),它们必须具有从GetHashCode返回的相同值。当两个对象具有相同的哈希值时,它们可以是同一个对象(Equals返回true)或者是不同的对象(Equals返回false)。
GetHashCode的结果没有其他保证。
Object类中的GetHashCode的默认实现根据内存中的对象地址或类似内容返回一个哈希值。如果需要进行其他身份比较,则必须覆盖Equals和GetHashCode。
答案 1 :(得分:1)
在调用此方法的类中重写GetHashCode方法,并根据唯一对象属性(如ID或所有对象字段)计算哈希代码。
答案 2 :(得分:1)
解决方案1:为所有子对象创建唯一ID,并使用该ID而不是哈希码。
解决方案2:用if(a.Equals(b))替换if(a.GetHashCode()== b.GetHashCode())。