
应该是在最初选定一个函数,之后保持不变。
否则的话,如何进行查找呢?随机选一个函数,表中相应的位置没有并不能说明表中真的没有。难道这组哈希函数集所有的哈希函数都试一遍?这个函数集中函数的个数至少要比表的大小要大(满足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")
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)