是否可以使用哈希码直接在 C# 字典中查找值
本文关键字:字典 查找 可以使 哈希码 是否 | 更新日期: 2023-09-27 18:30:21
我有很多字典实例,这些字典的内容经常变化,大约有100个条目(有时要少得多)。我需要经常查询此字典。我还不太确定,但我认为我的字典查找正在累积变得昂贵,并且对我的表现产生不利影响(这是一个关键问题)。
我可以缓存我的字符串键的哈希码吗
int hc = MyStrKey.GetHasCode();
然后直接通过哈希码在字典中查找相应的值(如果可以的话)?如果可能的话,不是推荐,加速值得吗?
通过内容频繁变化,我的意思是随着时间的推移,我会在字典中添加和删除条目。
另一种做法是否可以改用 int 键,我将实际字符串键的关联缓存为唯一(到特定字典)int 键并使用字典?
我可能在这里吠错树吗?
我怀疑这会有很大的不同,但你可以做一些时间测试来找出答案。
您可以为 String 编写一个简单的不可变包装类来缓存哈希代码,并将其用作键类型,例如:
public sealed class StringKey: IEquatable<StringKey>
{
public StringKey(string key)
{
Contract.Requires(key != null);
_key = key;
_hashCode = key.GetHashCode();
}
public override int GetHashCode()
{
return _hashCode;
}
public bool Equals(StringKey other)
{
if (ReferenceEquals(null, other))
return false;
if (ReferenceEquals(this, other))
return true;
return (_hashCode == other._hashCode) && string.Equals(_key, other._key);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
return false;
if (ReferenceEquals(this, obj))
return true;
return obj is StringKey && Equals((StringKey) obj);
}
public string Key
{
get
{
return _key;
}
}
private readonly string _key;
private readonly int _hashCode;
}
然而,就像我说的,我怀疑这会产生多大不同。
请记住,哈希代码并不是从字典(或哈希表)中查找项目所需的唯一项目。 它只会更快地找到项目所在的存储桶。
两个不相等的项目具有相同的哈希代码当然是可能的(并且并不少见)。 字典使用哈希代码查找存储桶,然后使用 Equals
将该存储桶中的项目与给定键进行比较。
把它想象成按颜色将乐高积木放在桶中 - 知道你需要的乐高的颜色可以帮助你更快地找到它,但你仍然需要知道你需要找到合适的乐高积木的确切部分。
那么,您可以通过字典中的哈希代码查找项目吗? 可能,但您仍然需要原始值以确保您获得了正确的项目。
我还不太确定,但我认为我的字典查找越来越贵
首先进行测量,并准确找出您要解决的问题。在具有 100 个键/值对的字典中进行查找应该非常快。
至于使用 int 或 String 作为键,请注意这些项的哈希码计算未在 FCL API 中定义,并且特定于实现。不可能做出笼统的陈述。