如何为JObject创建唯一的哈希码?

时间:2016-09-15 09:06:06

标签: c# json.net

我正在尝试为JObjects实现缓存。

我很惊讶地看到他们没有覆盖GetHashCode方法,因此我无法将其用作唯一键。

由于我的json非常庞大,我不想使用JObject.ToString().GetHashCode作为解决方案。

我确实看到他们有一个名为GetDeepHashCode的内部方法,但实现基于其他受保护的属性,因此,我无法复制"代码并从中创建扩展方法。

我也不想使用反射并调用内部GetDeepHashCode方法。

我正在寻找一种为JObject创建唯一缓存密钥的方法,而且我不希望这种方法在性能方面更加昂贵。

1 个答案:

答案 0 :(得分:4)

您可以使用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>期望值的独特性。