.net - String.GetHashCode() 的复杂性

标签 .net string hash

<分区>

Possible Duplicate:
Why might a System.String object not cache its hash code?

我一直认为,考虑到 .Net 字符串是不可变的,String.GetHashCode() 不必在每次调用时都计算哈希 — 如果字符不会改变,对于给定的 System.String 实例,哈希值是常量,我天真地认为; String.GetHashCode() 复杂度为 O(1)。

Reverse engineering it打破了这个假设。

当然,哈希码并不意味着是常量 and so on ,但是什么可以阻止 String 实现具有已经从构建时间计算出的哈希码?

最佳答案

好问题!

I asked the same thing a while back.

基本上,这是速度/内存的权衡。缓存字符串哈希码的好处可以说被每个字符串对象需要分配另外 32 位内存的开销所抵消。当您考虑程序中可能存在的大量字符串与您关心的哈希码数量相比时,这是有道理的(大概是因为您将它们用作键)。

后一个数字在某些程序中可能很大,但也可能很小。在很多情况下,它甚至可能为零。

如果在某些情况下性能是您极度关注的问题,您可能会考虑编写自己的包装器来缓存其哈希代码:

public class StringKey
{
    string value;
    int hashCode;

    public StringKey(string value)
    {
        this.value = value;
        this.hashCode = value.GetHashCode();
    }

    public override int GetHashCode()
    {
        return this.hashCode;
    }

    public override string ToString()
    {
        return this.value;
    }

    // Plus all the other stuff you'd want to include here,
    // e.g., Equals, CompareTo, etc.
}

当然,要从中获得任何好处,您仍然需要非常小心地在整个程序的任何地方重用这些 StringKey 对象。在绝大多数情况下,这样做是不值得的;如果您碰巧是一个异常(exception)情况,我只是将这个想法作为考虑因素。

关于.net - String.GetHashCode() 的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11549954/

相关文章:

.net - 带有绑定(bind)列表框的 WPF/DeferRefresh

php - 从包含 PHP 中括号的字符串中提取文本

java - 字符串的断言失败消息包含子字符串

hash - 容易记住数据的指纹?

algorithm - 均匀分布哈希函数

.net - 将 TaskContinuationOptions 应用于 "step"而不是整个链

c# - 返回一个已经从 WCF 格式化为 JSON 的字符串

c# - 嵌套使用是个好主意

c - 字符串到 ASCII 代码的转换并绑定(bind)它们

c - 使用整数值作为哈希表的键有多愚蠢?