C#理解散列码

C#理解散列码,c#,hash,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 Co

到目前为止,我收集到的是散列码是整数,有助于更快地从数组中查找数据。请看以下代码:

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();
string x=“运行程序以查找此字符串的哈希代码!”;
int hashCode=x.GetHashCode();

对于(int i=0;i对于给定对象,哈希代码在该程序执行的整个生命周期内保持不变是非常重要的。不应依赖给定对象的哈希代码在程序的多次执行中保持不变,这就是您正在做的。许多实现将恰好保持相同的哈希代码n个不同的程序调用,但.NET
字符串
实现没有

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

不,它们有助于更快地在基于散列的集合中查找数据。数组只是一个项目序列;在普通数组中不依赖散列代码,也不受益于使用散列代码

哈希码到底是什么

它是一个32位整数,用于在基于哈希的集合中插入和标识对象,如
哈希表
字典

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

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

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


如果您想要一个可以持久化并保证每次请求时都相同的哈希代码,然后使用标准的散列算法,如SHA1或MD5。

你说了两件相互矛盾的事情:
它给了我相同的随机数集
为什么每次循环时它都给我不同的随机数
。你到底在问什么?你想回答哪个问题?为什么
Random
在提供相同的种子时生成相同的数字,并且是。hashcodes如何工作是一个单独的问题,并且已经被回答了很多次。@nycdan
固定字符串的哈希值将始终是相同的
,严格来说这不是真的。这仅在程序的一次执行的上下文中是正确的,该约束不适用于此上下文。@Ixcioran35能否请您更新您的post than以删除不相关的
Random
code than?Servy的答案已经很好地说明了“为什么哈希代码会改变”,但很难看出这个答案与您当前状态下的帖子有什么关系。应该是+“九千多”,以了解OP在随机代码后面到底想问什么:)谢谢。但这是我从观察中推断出来的。如果可以的话。请elaborate@Ixcioran35有什么要详细说明的?您希望
GetHashCode
在程序调用中是相同的。文档特别告诉您不要这样做,因为这不是您可以依靠的保持稳定的东西。如果需要该功能,您必须编写自己的哈希函数,而不是使用
GetHashCode
,这样您就可以可靠地使用适合您需要的固定哈希算法。您使用的工具不是为您的工作设计的,所以不要这样做。关于第一个问题,哈希表是使用数组实现的,因此哈希代码实际上用于查找数组中项的索引,只是哈希表负责为您进行转换。
GetHashCode
string
实现与对象在内存中的位置无关。考虑到位于完全不同位置的不同字符串对象可以相等,引用的位置与之无关至关重要。@Servy我指的是基本
对象
实现。我已经澄清,定义“相等”的类使用不同的算法。