【发布时间】:2014-10-02 18:37:15
【问题描述】:
几乎所有教科书和 CS 课程都引用了两种实现哈希函数的基本方法:
-
除法,我们简单地做
k mod m,基本上选择m作为素数,不太接近2的幂。 - 乘法,我们将 k 与一些在 0 到 1 之间精心挑选的无理数(Knuth 建议使用基于黄金比例的数)相乘,取乘积的小数部分并使用所需数量的最高有效位来自它。
大多数教科书和课程都列举了方法 1 的几个缺点,包括它很昂贵并且事情取决于 m。但是,我从未见过任何教科书或课程提到方法 2 的单一缺点。
这使得方法 2 更可取。另外,方法 2 在现代计算机上可以非常有效地消除浮点运算。所以看起来方法 2 是毫无疑问的赢家,没有人应该谈论方法 1。但显然情况并非如此。事实上,我从未见过方法 2 用于任何实际实现。所以它确实有一些缺点。
问题是它们是什么,为什么尽管方法 1 有缺点,但它的使用频率更高?
【问题讨论】: