StringBuilder的GetHashCode生成不同的代码

时间:2016-03-30 00:59:17

标签: c# .net hashcode

为什么每次调用执行相同操作的函数({01234})时,哈希代码的生成方式都不同。值是a是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();
    }

3 个答案:

答案 0 :(得分:4)

这是因为哈希码并不意味着在对象的整个生命周期中都会发生变化。

如果你考虑字典,原因应该是清楚的。字典具有非常快的访问时间,因为对象基于其哈希代码放置在桶中,因此当您想要获取值时,字典不需要搜索所有值,它只是直接到哈希码定义的桶。 。如果哈希码发生变化,则查找将失败。

所以,对于可变对象,存在问题。哈希代码不能依赖于值,因为如果它确实存在,那么哈希代码会在值完成时改变,并且哈希代码不能改变。

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

答案 1 :(得分:1)

我想你想这样做......

  id.ToString().GetHashCode();

字符串中的哈希代码意味着在短时间内保持不变,但不能跨越多个长时间,甚至跨重新编译或运行时版本。即不要在执行实例之外使用它。存储价值几乎可以保证自杀。

答案 2 :(得分:0)

StringBuilder是可变对象,因此使用其GetHashCode方法不太实用。

因此,没有特殊的实现(与strings不同),它将基于对象的 value 而不是其引用标识(默认情况下对于所有其他引用类型都相同)

要确认您可以查看MSDN StringBuilder课程了解详细信息,并查看GetHashCode是&#34;是否继承自对象。&#34;