为什么每次调用执行相同操作的函数({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();
}
答案 0 :(得分:4)
这是因为哈希码并不意味着在对象的整个生命周期中都会发生变化。
如果你考虑字典,原因应该是清楚的。字典具有非常快的访问时间,因为对象基于其哈希代码放置在桶中,因此当您想要获取值时,字典不需要搜索所有值,它只是直接到哈希码定义的桶。 。如果哈希码发生变化,则查找将失败。
所以,对于可变对象,存在问题。哈希代码不能依赖于值,因为如果它确实存在,那么哈希代码会在值完成时改变,并且哈希代码不能改变。
因此,对于StringBuilder
,哈希码仅基于实例的引用。如果您创建新实例,则会有新的哈希码。它根本不是基于内容。
答案 1 :(得分:1)
我想你想这样做......
id.ToString().GetHashCode();
字符串中的哈希代码意味着在短时间内保持不变,但不能跨越多个长时间,甚至跨重新编译或运行时版本。即不要在执行实例之外使用它。存储价值几乎可以保证自杀。
答案 2 :(得分:0)
StringBuilder
是可变对象,因此使用其GetHashCode
方法不太实用。
因此,没有特殊的实现(与strings
不同),它将基于对象的 value 而不是其引用标识(默认情况下对于所有其他引用类型都相同)
要确认您可以查看MSDN StringBuilder课程了解详细信息,并查看GetHashCode
是&#34;是否继承自对象。&#34;