我不懂为什么Data.HashTable
正在使用Data.Hashable
, 其中有hashWithSalt
作为(唯一/基本)方法。
这不符合计算一次哈希值并将其存储在对象中的自然优化(自然,因为 Haskell 对象是不可变的)。
如果我想使用HashTables
这样,我就被迫实施hashWithSalt
。
(从 1.2.0.* 到 1.2.1.*,重新引入了 hashablehash
作为类方法,但这没有帮助?)
实际的表实现似乎没有利用hashWithSalt
(HashTable.ST.Linear
一点也不,HashTable.ST.Cuckoo
仅使用两种固定盐)。
正如卡尔在评论中指出的那样,转向hashWithSalt
方法超过刚刚hash
(如原Hashable
使用)是为了允许人们减轻基于哈希冲突的 DOS 攻击。在一段时间内,每次运行都会生成不同的随机默认盐,甚至使用unsafePerformIO
在后台。然而,对于对以下问题感兴趣的人来说,缺乏可重复性是一个巨大的问题。跨运行持久保存数据结构,获取可靠的基准测试数据等。
因此,当前的方法是提供方法,但倾向于遵循固定的默认盐,然后在文档中添加警告,表明如果以面向公众的方式使用,这仍然容易受到各种潜在的 DOS 攻击向量的影响。 (您可以在此处的文档中亲自查看:http://hackage.haskell.org/package/hashable-1.2.1.0/docs/Data-Hashable.html http://hackage.haskell.org/package/hashable-1.2.1.0/docs/Data-Hashable.html)
Because hash
是它自己的类方法,很容易实现一个带有“无盐”哈希的对象,并用它来记录,此外,您可以实现hashWithSalt
就这样xor
如果你愿意的话可以加盐。或者,正如评论所述,您可以实施hashWithSalt
通过更合法的方法hash
ing你生成/记忆的hash
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)