由内部字符串键入的字典的键是什么

What key for a dictionary keyed by interned strings

我希望将内存缓存数据结构与一组驻留字符串相关联,并使用已传递的驻留字符串实例来查找其关联的数据结构。

预定义的字符串集大约有 1000 个。缓存填充成本可以忽略,但我想要高性能查找。

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

理想情况下,我会创建一个以驻留字符串引用为键的字典,但 .Net 不会将对象引用公开为特定类型。

如果我将我的词典声明为:

Dictionary<string, InternedExtras>

然后我担心 System.String 相等覆盖将在字典查找期间调用 char by char 字符串值比较,这将是低效的。

一个选项是:

Dictionary<int, InternedExtras> _extrasDictionary

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

但是我从来没有完全理解哈希码数学并且理解不能保证唯一性。

我的实习字符串的平均长度是 50 个字符,我可以部署到最新的 .Net 版本。

实际上我认为这是您最有效的选择:

Dictionary<string, InternedExtras> _extrasDictionary;

照下面这样看其实效率很高!

InternedExtras extras = _extrasDictionary[interned];

您提到的逐字符比较只会在一小部分字符串上调用。这是因为 interned.GetHashCode() 将用于将它们分组为 "buckets".

这个问题有更多关于这个主题的细节:

How does a hash table work?