由内部字符串键入的字典的键是什么
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?
我希望将内存缓存数据结构与一组驻留字符串相关联,并使用已传递的驻留字符串实例来查找其关联的数据结构。
预定义的字符串集大约有 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?