为什么Data.HashTable使用hashing with salt(来自Data.Hashable)?

d8d*_*f42 6 haskell hashable

我不明白为什么Data.HashTable 使用Data.Hashable ,它具有hashWithSalt(唯一/基本)方法.

这不适合计算哈希值一次的自然优化,并将其存储在对象中(自然,因为Haskell对象是不可变的).

如果我想使用HashTables它,那么我被迫实施hashWithSalt.(打算1.2.0.*1.2.1.*,哈希的重新推出hash作为一个类的方法,但是这并没有帮助?)

实际的Table实现似乎没有使用hashWithSalt(HashTable.ST.Linear根本不HashTable.ST.Cuckoo使用,仅使用两个固定盐).

scl*_*clv 3

正如 Carl 在评论中指出的那样,转向该hashWithSalt方法hash(如最初Hashable使用的那样)是为了允许人们减轻基于哈希冲突的 DOS 攻击。在一段时间内,每次运行都会生成不同的随机默认盐,甚至使用unsafePerformIO在后台使用。然而,对于那些对跨运行持久数据结构、获取可靠的基准测试数据等感兴趣的人来说,这种可重复性的缺乏被证明是一个巨大的问题。

因此,当前的方法是提供方法,但倾向于遵循固定的默认盐,然后在文档中添加警告,表明如果以面向公众的方式使用,这仍然容易受到各种潜在 DOS 攻击向量的影响。(您可以在此处的文档中亲自查看:http://hackage.haskell.org/package/hashable-1.2.1.0/docs/Data-Hashable.html

因为hash是它自己的类方法,所以很容易实现一个带有“无盐”哈希的对象,并用它来记录,此外,如果您愿意,您可以hashWithSaltxor使用盐来实现。或者,正如评论所指出的,您可以hashWithSalt通过更合法的方法来实现hashgenerated/memoed hash