C# 散列函数(一般理论)

C# 散列函数(一般理论),c#,.net,hash,C#,.net,Hash,我寻找答案已经有一段时间了,我想知道是否有人知道如何在C#中显式(从头开始)定义哈希函数。我知道有一些预定义的数据结构具有列表功能,但我试图理解这些对象的底层结构 有人能帮忙吗?例如,如果您有两个数组,您如何才能从中创建哈希表?关于和的维基百科文章非常好。你也可以退房。最后,偷看一眼可能是一次有益的经历 如果您有更具体的问题,我们可能会提供更详细的信息。要能够对两个数组进行哈希运算,这在某种程度上取决于数组所保存的数据类型。例如,如果要对字符串数组进行散列,则在对字符串和整数进行散列之前需要额外

我寻找答案已经有一段时间了,我想知道是否有人知道如何在C#中显式(从头开始)定义哈希函数。我知道有一些预定义的数据结构具有列表功能,但我试图理解这些对象的底层结构

有人能帮忙吗?例如,如果您有两个数组,您如何才能从中创建哈希表?

关于和的维基百科文章非常好。你也可以退房。最后,偷看一眼可能是一次有益的经历


如果您有更具体的问题,我们可能会提供更详细的信息。

要能够对两个数组进行哈希运算,这在某种程度上取决于数组所保存的数据类型。例如,如果要对字符串数组进行散列,则在对字符串和整数进行散列之前需要额外的步骤对其进行编码,因为基本上需要的是在给定散列函数的情况下,将输入转换为散列表的索引。当然,在“转换输入”时,必须解决关键点之间的冲突问题。换句话说,您必须尝试最小化散列到相同值的键的数量,这就是为什么数论(特别是质数的使用)变得特别有用的原因

我假设,当您询问如何从两个数组“创建哈希表”时,您的意思是两个数组中的数据将成为表的键。在这种情况下,我不明白为什么需要引用两个数组,而不是包含两个数组元素的更大数组,除非处理的是静态类型的编程语言,并且两个数组可以有不同的类型。在这种情况下,您需要提出一个方案来将元素转换为整数。例如,如果您想将长度为n的字符串s(其中s[i]是字符串中的第i个字符(指其ASCII值)转换为整数,您可以查看它是如何使用素数基计算多项式的,以避免将不同的字符串散列为同一整数。基数是31的原因,除了它是素数这一事实,是因为乘以31接近2的幂,所以31可以有效地通过位移位来实现

一旦你把所有的元素都变成整数的形式,你就进入了问题的实质。有一些基本的技巧,我们可以根据这些技巧进行复杂的组合,前提是这些组合的组件彼此相对优先,这样我们就可以扩展到整个哈希表。两种基本方法是除法和乘法。这些方法本身,尤其是除法,是不够的,因为有人最终可以确定散列键的函数。我会尝试解释构造散列函数的常用方法,但我可能不会像以前那样解释它们。另一方面,我可以为您提供一个要满足的属性列表:

  • 你应该尽量减少碰撞
  • 您的函数应该能够将密钥散列到任何插槽
  • (以便不违反简单的统一散列)
  • 您的功能应该很难进行反向工程

请记住,为了满足最后一个属性的要求,通常哈希函数的某些组件应该至少使它们映射键的插槽看起来是随机的。由于这个限制,我们仍然会有非零的发生碰撞的概率,因此您要解决的下一个问题是碰撞解决

,感谢上面的链接。我会检查的。我还为这个问题添加了一个附加部分,主要是如果您有两个数组,那么如何使用它们创建哈希表?