如何为JObject创建唯一的哈希码?
我正在尝试为JObjects
实现缓存。
我很惊讶地看到他们没有覆盖GetHashCode
方法,因此我不能将它用作唯一键。
由于我的json非常大,我不想使用JObject.ToString().GetHashCode
作为解决方案。
我确实看到他们有一个名为GetDeepHashCode
的内部方法,但实现基于其他受保护的属性,因此,我无法“复制”代码并从中创建扩展方法。
我也不想使用reflection并调用内部GetDeepHashCode
方法。
我正在寻找一种为JObject
创建唯一缓存键的JObject
,我不希望这种方法在性能方面更加昂贵。
您可以使用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
。值是期望的。