【问题标题】:How can I create a unique hashcode for a JObject?如何为 JObject 创建唯一的哈希码?
【发布时间】: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,它可以满足您的需求。

标签: c# json.net


【解决方案1】:

您可以为此目的使用JTokenEqualityComparer.GetHashCode(JToken token)。它提供对您看到的GetDeepHashCode() 方法的访问。

var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);

请注意,JTokenEqualityComparer.Equals(JToken x, JToken y) 调用 JToken.DeepEquals() (source),因此在构建 LINQ-to-JSON 对象的哈希表或字典时,此比较器适合用作 IEqualityComparer<JToken>,并且需要值的唯一性。

【讨论】:

    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多