请问算法导论中的全域哈希(universal hashing)是每一组 *** 作选定一个哈希函数,还是每次 *** 作选定一个?

请问算法导论中的全域哈希(universal hashing)是每一组 *** 作选定一个哈希函数,还是每次 *** 作选定一个?,第1张

应该是在最初选定一个函数,之后保持不变。

否则的话,如何进行查找呢?随机选一个函数,表中相应的位置没有并不能说明表中真的没有。难道这组哈希函数集所有的哈希函数都试一遍?这个函数集中函数的个数至少要比表的大小要大(满足universal性质的必要条件),全部试一遍还不如遍历一下表。

对于单一hash,如果攻击者获悉了hash算法,就可能构造大量hash值相同的key进行攻击。大量key进入同一个hash slot,让hash table的查询从o(1)退化成o(n)。 HashDoS

针对HashDoS,一个朴素的思想就是随机选取hash函数,这样构造的攻击key就很大可能失效

具体来看,我们的根本目的是什么?

我们的根本目的是 让key均匀分布在hash table的各个slot上

在给定单hash函数的情况下,均匀分布需要达到什么数学条件:

对于n个独立不同的keys,容量为m的hash table,如果满足均匀分布,则每个slot的使用量应当为 |n/m|

也就是说,对于特定的key k,从剩余(n-1)个key中随机挑选一个k‘,则 (k, k’) 落到同一slot的概率为1/m ,这样k所在slot的使用量才会满足 (n-1) 1/m = |(n-1)/m| = |n/m|

而我们需要变化的hash函数,那么扩展一下思维, 给定一个hash函数=>给定一组hash函数 ,使用时随机选择一个hash函数,剩下的部分就转换为了上文刚刚讨论的单hash函数情况——

于是,我们需要一个hash函数集合,使得对任意 (k, k’) from keys,从哈希函数集中随机选择一个哈希函数, (k, k’) 发生冲突的概率是1/m

于是,我们有全域hash的定义:

Proof: Each y ∈ S (y ≠ x) has at most a 1/M chance of colliding with x by the definition of “universal” So,

forName支持数组类型,loadClass不支持数组

一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用ClassforName(name)了。

例如,在JDBC编程中,常看到这样的用法,ClassforName("commysqljdbcDriver")

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12182158.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存