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

Ami*_*ich 6 c# json.net

我正在尝试为JObjects.

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

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

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

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

我正在寻找一种为 a 创建唯一缓存键JObject的方法,并且我不希望该方法在性能方面变得格外昂贵。

dbc*_*dbc 7

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

var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);
Run Code Online (Sandbox Code Playgroud)

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