C# inproc和stateserver会话变量的GetHashCode值不同

C# inproc和stateserver会话变量的GetHashCode值不同,c#,asp.net,session,C#,Asp.net,Session,我最近继承了一个应用程序,它大量使用会话,包括在会话中存储大量自定义数据对象。我使用这个应用程序的第一个要点是,至少将会话数据从InProc移开,然后将其卸载到stateserver或SQL Server 在我将所有适当的数据对象都序列化,并将web.config更改为使用状态服务之后,一切似乎都正常工作 但是,我发现这个应用程序使用GetHashCode()进行了很多对象比较。当会话处于InProc状态时工作正常的方法不再工作,因为哈希代码不再匹配。当您知道子对象的原始哈希代码时,尝试从父对象

我最近继承了一个应用程序,它大量使用会话,包括在会话中存储大量自定义数据对象。我使用这个应用程序的第一个要点是,至少将会话数据从InProc移开,然后将其卸载到stateserver或SQL Server

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

但是,我发现这个应用程序使用GetHashCode()进行了很多对象比较。当会话处于InProc状态时工作正常的方法不再工作,因为哈希代码不再匹配。当您知道子对象的原始哈希代码时,尝试从父对象中查找特定的子对象时,就会出现这种情况

如果我简单地将web.config改回使用inproc,它会再次工作

有人想过从哪里开始吗


编辑:

谢谢你的快速回复。关于:

对象类中GetHashCode的默认实现根据内存中的对象地址或类似内容返回哈希值。如果需要其他身份比较,则必须重写Equals和GetHashCode


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

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

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

我感觉到这段代码有严重的问题。GetHashCode方法不保证返回的哈希值在给定两个不同对象时以任何方式都是唯一的。就GetHashCode而言,它可以为所有对象返回0,并且仍然被认为是正确的

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

GetHashCode的结果没有其他保证

对象类中GetHashCode的默认实现根据内存中的对象地址或类似内容返回哈希值。如果需要进行其他身份比较,则必须重写Equals和GetHashCode。

写入时

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

我感觉到这段代码有严重的问题。GetHashCode方法不保证返回的哈希值在给定两个不同对象时以任何方式都是唯一的。就GetHashCode而言,它可以为所有对象返回0,并且仍然被认为是正确的

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

GetHashCode的结果没有其他保证


对象类中GetHashCode的默认实现根据内存中的对象地址或类似内容返回哈希值。如果需要进行其他身份比较,则必须重写Equals和GetHashCode。

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


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

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

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