2017-03-09 70 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