C#了解哈希码

时间:2015-10-09 16:48:16

标签: c# hash

到目前为止我收集的是哈希码是整数,可以帮助更快地从数组中查找数据。看看这段代码:

string x = "Run the program to find this string's hash code!";
int hashCode = x.GetHashCode();

for(int i = 0; i<100; i++)
{

// the hash code that is printed is always different
Console.WriteLine("Hash Code is: {0}", hashCode);

Console.ReadKey();

我的问题是:为什么每次迭代循环时它都会给我一个不同的哈希代码?为什么即使字符串没有改变,x的哈希代码也会不断变化?

2 个答案:

答案 0 :(得分:4)

在整个程序执行的生命周期中,哈希代码对于给定对象保持相同非常重要。不应该依赖给定对象的哈希码来保持程序的多次执行中的,这就是你正在做的事情。许多实现将在不同的程序调用中保持相同,但.NET string实现不会。

答案 1 :(得分:0)

  

到目前为止我收集的是哈希码是整数,有助于更快地从数组中查找数据

不,它们有助于更快地在基于哈希的集合中查找数据。数组只是一系列项目;在普通数组中不依赖于哈希码或从中获益。

  

究竟什么是哈希代码

它是一个32位整数,用于插入和标识基于散列的集合中的对象,如HashtableDictionary

  

它们是如何生成的(如有必要)?

所有对象都没有一种算法用于生成哈希码。唯一的限制是:1)两个“相等”对象必须生成相同的哈希码,2)对象的哈希码在该对象的生命周期内不得更改 没有限制,不同程序中的两个“相等”对象 会返回相同的哈希码

默认实现使用内存中对象的位置。诸如string之类的类将“相等”定义为“对内存中相同对象的引用”之外的其他类,会覆盖此默认行为以遵守上面的规则1。

如果你想要一个可以持久化的哈希码,并且每次要求它都保证相同,那么使用标准的哈希算法,如SHA1或MD5。