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

How can I create a unique hashcode for a JObject?

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

我很惊讶他们没有覆盖 GetHashCode 方法,因此我不能将它用作唯一键。

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

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

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

我正在寻找一种方法来为 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) calls JToken.DeepEquals() (source) so this comparer is suited for use as an IEqualityComparer<JToken> 在构建 LINQ-to-JSON 对象的哈希表或字典时需要值的唯一性。