StringBuilder的GetHashCode生成不同的代码

Kar*_*Kar 2 .net c# hashcode

为什么每次调用执行相同功能的函数({01234})时,哈希代码生成的方式都不同。值是37121646,那么当我再次运行时,它是45592480。

    static void Main(string[] args)
    {

        int a;
        Program pp = new Program();
        a = pp.getHash();
    }

    private int getHash()
    {
        StringBuilder id = new StringBuilder();
        for (int i = 0; i < 5; i++)
        {
            id.Append(i);
        }
        return id.GetHashCode();
    }
Run Code Online (Sandbox Code Playgroud)

Eni*_*ity 6

这是因为哈希码无意在对象的整个生命周期内进行更改。

如果考虑使用字典,这样做的原因应该很清楚。字典具有非常快的访问时间,因为对象是根据其哈希码放置在存储桶中的,因此当您想要获取值时,字典不需要搜索所有值,它会直接进入哈希码定义的存储桶。如果哈希码更改,则查找将失败。

因此,使用可变对象存在一个问题。哈希码不能依赖于值,因为如果这样做,则哈希码将在值出现时更改,并且哈希码不得更改。

因此,对于a StringBuilder,哈希码仅基于实例的引用。如果创建新实例,则将具有新的哈希码。它根本不是基于内容。