理解.net中的哈希码

本文关键字:哈希码 net 理解 | 更新日期: 2023-09-27 18:17:09

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

string x = "Run the program to find this string's hash code!";
int hashCode = x.GetHashCode();
Random random = new Random(hashCode);
for(int i = 0; i<100; i++)
{
// Always generates the same set of random integers 60, 23, 67, 80, 89, 44, 44 and so on...
int randomNumber = random.Next(0, 100);
Console.WriteLine("Hash Code is: {0}", hashCode);
Console.WriteLine("The random number it generates is: {0}", randomNumber);
Console.ReadKey();

您可以看到,我使用字符串x的哈希码作为随机数生成器的种子。这段代码给了我100个随机整数,但是每次我运行这个程序,它都会给我一组相同的随机数!我的问题是:为什么每次它在循环中迭代时都给我一个不同的随机数?为什么x的哈希码一直在变化,即使字符串没有改变。哈希码到底是什么,它们是如何生成的(必要时)?

理解.net中的哈希码

在程序执行的整个生命周期中,对于给定对象的哈希码保持相同是至关重要的。给定对象的哈希码不应该依赖于在程序的多次执行中保持相同的,这就是您正在做的。许多实现碰巧在不同的程序调用中保持相同,但. net string实现不是。

我现在收集到的是哈希码是整数,可以帮助更快地从数组中找到数据

不,它们有助于在基于散列的集合中更快地查找数据。数组就是一组元素的序列;在普通数组中使用哈希码既不依赖也不受益。

哈希码到底是什么

32位整数,用于在基于哈希的集合(如HashtableDictionary)中插入和标识对象

是如何生成的(如果需要的话)?

并不是所有的对象都使用一种算法来生成哈希码。唯一的限制是1)两个"相等"的对象必须生成相同的哈希码,2)一个对象的哈希码在该对象的生命周期内不能改变两个"相等"的对象在不同的程序中返回相同的哈希码没有限制。

默认实现使用对象在内存中的位置。像string这样将"相等"定义为"对内存中相同对象的引用"的类覆盖了这个默认行为,以遵守上面的规则1。

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