2017-03-09 211 views
1

我希望在內存中緩存數據結構與一組實習字符串的關聯,並使用一個實習字符串的通過實例來查找其相關的數據結構鍵控字典哪些關鍵。通過實習字符串

預定的一系列字符串將是1000年左右的數量。緩存人口成本可以忽略,但我想要高性能的查找。

public class InternedExtras 
{ 
    public DateTime Prop1 {get; set; } 
    public Decimal Prop2 {get; set; } 
} 

理想我想創建鍵上的實習串的參考字典,但.NET不公開對象引用的特定類型。

如果我宣佈我的解釋爲:

Dictionary<string, InternedExtras> 

然後我關注的是字典查找,這將是低效的過程中System.String平等倍率調用使用字符串值比較字符。

的選擇是:

Dictionary<int, InternedExtras> _extrasDictionary 

InternedExtras GetInternedExtras(string knownToBeInterned) 
{ 
    return _extrasDictionary[ knownToBeInterned.GetHashCode() ]; 
} 

但是我從來沒有完全理解哈希碼數學和理解唯一性無法得到保證。

我的實習字符串的平均長度是50個字符,我可以部署到最新的.Net版本。

回答

1

其實,我覺得這是你最有效的選擇:

Dictionary<string, InternedExtras> _extrasDictionary; 

做一個尋找如下實際上是非常有效的!

InternedExtras extras = _extrasDictionary[interned]; 

成炭比較,你指的燒烤到只會對字符串的一小部分被調用。這是因爲interned.GetHashCode()將用於將他們的密鑰分組爲「桶」。

這個問題有關於這個問題的更多細節:

How does a hash table work?

+0

@達納 - 三江源約詞典/的hashCode的性能保證。我是否認爲System.String不會在調用someString.GetHashCode之間存儲字符串的哈希碼? – camelCase

+1

我其實不這麼認爲(請參閱下面的源代碼ref)。我只知道'Dictionary '是進行快速內存查找的事實上的方式,並且是BCL的一部分(即由Microsoft實施)。如果您有任何疑問,您應該運行一些性能測試。 https://referencesource.microsoft.com/#mscorlib/system/string.cs – dana