在通过线性探测解决冲突的哈希表中,为了确保期望的性能,哈希函数来自5个独立家族是必要且充分的。(充分性:“具有恒定独立性的线性探测”,Pagh等人,必要性:“关于线性探测和最小独立性要求的k独立性”,Pătraşcu和Thorup)
据我了解,已知最快的5个独立家庭使用列表。从这样的家族中选择一个功能可能会很昂贵,因此我想尽量减少这样做的次数,同时仍要防止算法复杂性攻击,如Crosby和Wallach的“通过算法复杂性攻击拒绝服务”中所述。我不太担心计时攻击(即带有秒表的对手)。重用相同功能的后果是什么:
- 当散列表太满时?
- 缩小不够完整的哈希表时?
- 重建具有太多“已删除”位设置的哈希表时?
- 在不同的哈希表中可能包含一些共同的键?
如果这是关于实践的问题,那么可行的方法是使用加密哈希函数(输入中包含随机秘密),而不是使用基于列表的方案。这样就减少了重用相同哈希函数的压力。您可以为每个哈希表使用不同的密码(并在缩小/增长/重建哈希表时更改密码并重新哈希所有内容)。
—
DW
我认为即使与使用多项式的独立于5的族相比,短输入(例如SipHash-2-4)上的快速密码哈希函数也相当慢。
—
jbapple