0

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

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

 int hc = MyStrKey.GetHasCode();

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

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

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

我可能在这里吠叫错误的树吗?

4

3 回答 3

2

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

您可以为缓存哈希码的 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;
}

但是,就像我说的那样,我怀疑这会产生很大的不同。

于 2013-09-05T12:58:53.507 回答
1

请记住,哈希码并不是从字典(或哈希表)中查找项目所需的唯一项目。它只会使找到该项目所在的存储桶的速度更快。

两个不相等的项目具有相同的哈希码当然是可能的(并且并不少见)。字典使用哈希码查找存储桶,然后使用 将该存储桶中的项目与给定键进行比较Equals

可以将其想象为按颜色将乐高积木组织在桶中 - 了解您需要的乐高积木的颜色可以帮助您更快地找到它,但您仍然需要知道找到正确部件所需的确切部件。

那么你可以通过字典中的哈希码查找项目吗?可能,但您仍然需要原始值来确定您获得了正确的项目。

于 2013-09-05T15:14:57.893 回答
0

我还不太确定,但我认为我的字典查找越来越贵

首先进行测量并准确找出您要解决的问题。在具有 100 个键/值对的字典中进行查找应该非常快。

至于使用整数或字符串作为键,请注意这些项目的哈希码计算未在 FCL API 中定义,并且是特定于实现的。不可能做出笼统的陈述。

于 2013-09-05T13:35:10.803 回答