2011-09-14 20 views
3

簡短問題:如何獲得已重新實施GetHashCode()的對象的object.GetHashCode()值?如何從重新實現GetHashCode的類中獲取原始哈希碼?

長篇小說: 所以我有大約十萬個對象,每個對象共享許多(非編譯時間)常見字符串。如果值相等,那麼通常就是同一個實例。我知道,我寧願使用標準對象比較(ReferenceEquals)而不是完整的字符串比較 - 尤其是因爲這些字典是在相當規範的基礎上在字典中查找的。

因此,我聲明class ReferenceEqualityComparer : IEqualityComparerDictionary<string, TValue>一起使用,認爲無論如何它會是有用的,並嘗試實施這兩種方法。

等於是很容易,使用object.ReferenceEquals

但是,如何獲得等效的GetHashCode方法?

即如何獲得對象實例的某種表示形式?

我知道還有其他辦法,我可以去這樣做 - 創建一個InternedString類持有的string的引用,但沒有實現EqualsGetHashCode,或存儲索引,而不是每個對象的字符串,但我現在好奇 - 是否有一種方法來實現一個通用的ReferenceEqualityComparer

+0

喬恩Skeet肯定給出瞭如何做你正在做的事情的簡單而正確的答案。不過,我的傾向是將每個字符串包裝在一個簡單的不可變結構中,該結構只保存對字符串的引用,並覆蓋GetHashCode和Equals以在所包含的字符串上調用RuntimeHelpers.GetHashCode或Object.ReferenceEquals。 – supercat

+0

我不喜歡使用ReferenceEquals和String類型的暴露對象,因爲很多代碼都希望任何String對象都可以被具有相同長度和內容的其他對象替換,而不會影響程序語義。在大多數情況下,只包含單個類引用的值類型應該非常像引用類型;我意識到的最大問題是如果將這種類型轉換爲Object或接口類型,則會將其封裝。 – supercat

+0

嗨超級貓,這將是一個選擇是的。就其本身而言,所有字符串都只用於不可變的內部類 - 不是公有的,並且沒有被規則中斷字符串替換的危險。但是我可能只是爲了正確的目的而遵循你的建議 - 然而,在沒有RuntimeHelpers的知識的情況下,我甚至無法知道如何做到這一點,默認情況下struct.GetHashCode的速度非常慢。 – Mania

回答