2016-09-15 50 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>