【发布时间】:2014-07-13 17:18:49
【问题描述】:
我不明白为什么 Data.HashTable 使用 Data.Hashable ,它具有 hashWithSalt 作为(唯一/基本)方法。
这不符合计算哈希值一次并将其存储在对象中的自然优化(自然,因为 Haskell 对象是不可变的)。
如果我想使用HashTables,那么我不得不实现hashWithSalt。
(从 1.2.0.* 到 1.2.1.*,hashable 重新引入了hash 作为类方法,但这并没有帮助?)
实际的 Table 实现似乎没有使用 hashWithSalt(HashTable.ST.Linear 根本没有,HashTable.ST.Cuckoo 仅使用两个固定盐)。
【问题讨论】:
-
你在看什么包? hackage.haskell.org/package/base-4.5.1.0/docs/… 根本不使用
Hashable。 -
不能按照
hash来实现hashWithSalt吗? cuckoo 版本可能不起作用,但其他哈希表会。 -
哈希表使用带盐的哈希的原因是为了在攻击者可以控制插入表中的密钥时减轻哈希冲突 DoS 攻击。当然,他们应该使用特定于站点的盐而不是图书馆固定的盐..
-
@dfeuer:
Data.HashTable在 base-4.6 中,但与 base-4.7 分开我正在查看 hackage.haskell.org/package/hashtables-1.1.2.1 -
@d8d0d65b3f7cf42 确实如此。每当您运行与外界交互的服务时,您都需要注意潜在的攻击。一个众所周知的(或者我认为)攻击是对用于存储攻击者提供的密钥的哈希表的冲突攻击。这是一种拒绝服务攻击,它通过强制每个键进入同一个哈希桶来使进程过载,从而导致对每次插入时已经存在的键进行线性时间检查。