代码之家  ›  专栏  ›  技术社区  ›  AaronS

InProc和StateServer会话变量的GetHashCode的不同值

  •  0
  • AaronS  · 技术社区  · 16 年前

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

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

    但是,我发现这个应用程序使用getHashCode()进行了很多对象比较。当会话处于Inproc时工作良好的方法不再工作,因为哈希代码不再匹配它们应该匹配的时间。当您知道子对象的原始哈希代码时,当您试图从父对象中查找特定的子对象时,可能会出现这种情况。

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

    有人想从哪里开始吗?


    编辑:

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

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

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   qbeuek    16 年前

    当你写作时

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

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

    当两个对象相同(equals方法返回true)时,它们 必须 从GetHashCode返回相同的值。当两个对象具有相同的哈希值时,它们 可以 同一对象(等于返回真)或不同对象(等于返回假)。

    GetHashCode的结果没有其他保证。

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

        2
  •  1
  •   qbeuek    16 年前

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

        3
  •  1
  •   Hallgrim    16 年前

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

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