【发布时间】:2016-09-15 17:33:57
【问题描述】:
我正在尝试为JObjects 实现缓存。
我很惊讶他们没有覆盖 GetHashCode 方法,因此我不能将它用作唯一键。
由于我的 json 非常大,我不想使用 JObject.ToString().GetHashCode 作为解决方案。
我确实看到他们有一个名为 GetDeepHashCode 的内部方法,但该实现基于其他受保护的属性,因此,我无法“复制”代码并从中创建扩展方法。
我也不想使用反射并调用内部GetDeepHashCode 方法。
我正在寻找一种为 JObject 创建唯一缓存键的方法,我不希望该方法在性能方面过于昂贵。
【问题讨论】:
-
您确定要使用 GetHashCode 作为唯一键吗?根据定义不同的对象不需要有不同的哈希码
-
您是否希望在往返于字符串表示形式之间的哈希码相同?因为
JValue可以包含double,并且双倍do not round-trip without precision loss。 -
@HaraldCoppoolse - 我理解这一点,并且我理解当您发生冲突时,会调用 Equals 方法。这就是在覆盖 GetHashCode 时需要覆盖 Equals 的原因。由于他们没有覆盖 GetHashCode,我正在寻找一种快速的方法来做到这一点。
-
@dbc - 我试图避免往返字符串。我不在乎我是否在特定场合丢失了一些缓存命中。
-
我的意思是,如果你往返包含一个来自和到 JSON 的双精度的
JValue,它的哈希码可能会改变。无论如何,使用JTokenEqualityComparer,它可以满足您的需求。