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

How can I create a unique hashcode for a JObject?(如何为 JObject 创建唯一的哈希码?)
本文介绍了如何为 JObject 创建唯一的哈希码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to implement a cache for JObjects.

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

I was surprised to see that they didn't override the GetHashCode method and therefore, I can't use it as a unique key.

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

Since my json's are pretty large, I don't want to use JObject.ToString().GetHashCode as a solution.

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

I did see that they have an internal method called GetDeepHashCode but the implementation is based on other protected properties and therefore, I cannot "copy" the code and create an extension method from it.

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

I also don't want to use reflection and invoke the internal GetDeepHashCode method.

我正在寻找一种为 JObject 创建唯一缓存键的方法,并且我不希望该方法在性能方面过于昂贵.

I'm looking for a way to create a unique cache key for a JObject and I don't want the method to be extra expensive when it comes to performance.

推荐答案

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

You can use JTokenEqualityComparer.GetHashCode(JToken token) for this purpose. It provides access to the GetDeepHashCode() method you saw.

var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);

请注意 JTokenEqualityComparer.Equals(JToken x, JToken y) 调用 JToken.DeepEquals() (来源) 所以这个比较器适合用作 IEqualityComparer<JToken> 在构建 LINQ-to-JSON 对象的哈希表或字典时,需要值的唯一性.

Note that JTokenEqualityComparer.Equals(JToken x, JToken y) calls JToken.DeepEquals() (source) so this comparer is suited for use as an IEqualityComparer<JToken> when constructing hash tables or dictionaries of LINQ-to-JSON objects and uniqueness of values is desired.

这篇关于如何为 JObject 创建唯一的哈希码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)