哈希乘法方法的过程背后的动机是什么?

时间:2019-04-08 09:14:46

标签: methods hash hashtable multiplication

我开始从CLRS学习有关哈希的方法(Cormen等人)。我能够理解数学过程以及如何执行计算机。这本书只是简单地将数学过程表述为-

-> multiply the key k with a constant A (0<A<1), results into kA;

-> extract the fractional part of kA by doing (kA mod 1);

-> multiply the result with m (usually taken to be a power of 2 for easy 
implementation on computers);

-> take the floor of this result and that is the hashed value;

-> therefore, this is the hashing function, h(k) = floor[m*(kA mod 1)]

这本书进一步说明了如何在大多数计算机上实现它,它比除法的优势以及Knuth对“ A”值的建议。

我无法理解的是,为什么我们要遵循以下过程:将键与范围在0到1之间的数字(A)专门相乘,然后取小数部分,然后乘以m,然后取地板?

这是否产生“近似于” SUHA(简单统一哈希的假设)的散列值,即理想情况下每个键应独立地散列到m个时隙中的任何一个,所以此方法产生的结果是否“更接近”此理想? / p>

1 个答案:

答案 0 :(得分:0)

理想的哈希应该满足简单统一哈希的假设。

例如在哈希函数h(k): U--> {0...m-1}中,其中U是可能的键的范围,而m是表的大小

这意味着每次您对哈希世界中的任何密钥进行散列时,密钥中的任何一个都应该同样有可能最终出现在同一位置,并且密钥的分布均匀地分布在所有位置上吗?

嗯,在实践中并不是那么容易,我们不知道提前分配密钥的可能性,即使我们这样做,我们仍然不知道哪个密钥将从该宇宙中抽出。

>

因此,我们需要根据对键的了解来实践,以在k上创建一些性能良好的计算并将键在整个表中分配得很好。

这就是我们在方法之间进行交易的地方,

采用除法:只需h(k) = k mod m键即可对表的大小取模。 简单,快速且仅产生法律价值,但您必须非常小心地选择m!例如,如果表是2的幂,则实际上是在使用k的最低有效位,并且这些键可能显示特定的结构。因此,为m选择一个质数可能接近2的精确乘方。

让我们继续进行乘法方法的对比:h(k) = floor[m*(kA mod 1)]其中(0<A<1)

我们将密钥与小数相乘,因此mod 1可以将小数部分取出。本质上,您将不断地将m与0之间的一个数字乘以,但不包括1,最后,我们以该结果的下限为底来获取一个整数。 这比除法要慢,但是无论您为m选择什么都没有关系m的值并不重要!

回到您的问题,这完全取决于您采用的是哪种类型的实现,以及相应地如何使用哈希表。有很多。