如何为 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 对象的哈希表或字典时需要值的唯一性。
我正在尝试为 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 对象的哈希表或字典时需要值的唯一性。