0

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

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

但是,我发现这个应用程序使用 GetHashCode() 进行了很多对象比较。当会话是 InProc 时运行良好的方法不再起作用,因为 HashCode 在它们应该匹配时不再匹配。当您知道子对象的原始哈希码时尝试从父对象中查找特定子对象时,似乎就是这种情况

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

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


编辑:

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

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

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

4

3 回答 3

2

当你写

使用 GetHashCode() 进行大量对象比较

我觉得这段代码有一些可怕的问题。GetHashCode 方法不保证返回的哈希值在给定两个不同对象的情况下应该是唯一的。就 GetHashCode 而言,它可以为所有对象返回 0 并且仍然被认为是正确的。

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

GetHashCode 的结果没有其他保证。

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

于 2008-09-17T19:46:06.777 回答
1

覆盖调用此方法的类中的 GetHashCode 方法,并根据唯一的对象属性(如 ID 或所有对象字段)计算哈希码。

于 2008-09-17T19:38:37.730 回答
1

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

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

于 2008-09-17T20:32:12.187 回答