【发布时间】:2016-01-19 08:48:24
【问题描述】:
是否有任何实现可以在通用散列中选择几个散列函数并尝试这些函数以将总冲突减少到可接受的水平并以最少的冲突返回最佳结果?
如果有,从现有数组构建哈希表比先创建哈希表然后插入所有元素可靠得多,不是吗?
以下段落来自算法简介。
"如果恶意攻击者选择要通过某个固定散列函数散列的密钥,则攻击者可以选择 n 个全部散列到同一槽的密钥,从而产生平均检索时间为 ‚.n/。任何固定散列函数很容易受到这种可怕的最坏情况行为的影响;改善这种情况的唯一有效方法是随机选择散列函数,这种方式与实际存储的密钥无关。这种称为通用散列的方法可以无论对手选择哪个键,平均都会产生可证明的良好性能。
在通用散列中,在执行开始时我们选择散列函数 从精心设计的一类函数中随机抽取。与快速排序的情况一样,随机化保证没有单个输入总是会引发最坏情况的行为。因为我们随机选择散列函数,算法在每次执行时表现不同,即使对于相同的输入,保证良好的 任何输入的平均情况下的性能。回到编译器的例子 符号表,我们发现程序员对标识符的选择现在不会导致哈希性能一直很差。只有当编译器选择了一个随机散列函数导致标识符集散列效果不佳时才会出现性能差,但这种情况发生的概率很小,并且对于任何相同大小的标识符集都是相同的。”
【问题讨论】:
-
doc.qt.io/qt-5/qhash.html 中描述的行为为“为了避免这种最坏情况的行为,qHash() 完成的哈希值计算可以通过随机种子进行盐渍化,从而使攻击无效。范围。这个种子由 QHash 每个进程自动生成一次,然后由 QHash 作为 qHash() 函数的双参数重载的第二个参数传递。可能会让人头疼,因为存储 QHash 派生图的程序很难比较相同代码的两次连续运行的结果。