2016-09-15 48 views
3

我试图实现JObjects缓存。如何为JObject创建唯一的哈希码?

我很惊讶地看到他们没有重写GetHashCode方法,因此我不能将它用作唯一键。

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

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

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

我正在寻找一种方法来为JObject创建一个唯一的缓存密钥,我不希望该方法在性能方面更加昂贵。

+1

您确定要将GetHashCode用作唯一键吗?根据定义,不同的对象不需要具有不同的哈希码 –

+0

您是否希望哈希码在往返于字符串表示的往返之后相同?因为一个'JValue'可以包含一个'double',并且double [不会在没有精度损失的情况下往返移动](http://stackoverflow.com/questions/24299692/why-is-a-round-trip-conversion-via -a串而不是安全换一个双)。 – dbc

+0

@HaraldCoppoolse - 我明白,并且我明白,当碰撞时,Equals方法被调用。这就是您重写GetHashCode时需要覆盖Equals的原因。 由于他们没有重写GetHashCode,我正在寻找一个快速的方法来做到这一点。 –

回答

3

您可以使用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)所以这个比较器构造哈希表或LINQ到JSON对象和值的唯一性的字典当期望适合于用作IEqualityComparer<JToken>