是否可以使用哈希码直接在 C# 字典中查找值

本文关键字:字典 查找 可以使 哈希码 是否 | 更新日期: 2023-09-27 18:30:21

我有很多字典实例,这些字典的内容经常变化,大约有100个条目(有时要少得多)。我需要经常查询此字典。我还不太确定,但我认为我的字典查找正在累积变得昂贵,并且对我的表现产生不利影响(这是一个关键问题)。

我可以缓存我的字符串键的哈希码吗

 int hc = MyStrKey.GetHasCode();

然后直接通过哈希码在字典中查找相应的值(如果可以的话)?如果可能的话,不是推荐,加速值得吗?

通过内容频繁变化,我的意思是随着时间的推移,我会在字典中添加和删除条目。

另一种做法是否可以改用 int 键,我将实际字符串键的关联缓存为唯一(到特定字典)int 键并使用字典?

我可能在这里吠错树吗?

是否可以使用哈希码直接在 C# 字典中查找值

我怀疑这会有很大的不同,但你可以做一些时间测试来找出答案。

您可以为 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 中定义,并且特定于实现。不可能做出笼统的陈述。