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

标签 c# json.net

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

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

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

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

我也不想使用反射并调用内部的 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) 电话 JToken.DeepEquals() ( source ) 所以这个比较器适合用作 IEqualityComparer<JToken> 在构造 LINQ-to-JSON 对象的哈希表或字典时需要值的唯一性。

关于c# - 如何为 JObject 创建唯一的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39507095/

相关文章:

c# - WCF 服务返回无效的 JSON 输出

c# - Log4Net:处置 MemoryAppender

c# - 随机排列坐标值的3D插值

c# - 如何使用 Newtonsoft.Json 反序列化空 JSON 对象?

c# - 使用 Json.Net 在 C# 中解析 Json

c# - ASP.NET Core Web 应用程序 (.NET Framework) 项目模板缺少 System.Web.MVC dll

c# - 组合 DataTextField 中的两个字段。这可能吗?

c# - Asp.net core WebApi 中空值的自定义序列化

c# - 在非 IEnumerable 类型上使用 lambda 表达式过滤 Windows 日志

C#反序列化派生并具有引用的对象