4

似乎 C++17 string_view 的std::hash 函数不是 constexpr 的。

在我看来,绑定到 const char[] 的字符串视图可以在编译时进行散列(这会非常好),或者有什么可以防止这种情况发生吗?

4

1 回答 1

10

从 C++14 开始(参见 17.6.3.4 哈希要求,表 26),我们有:

返回的值应仅取决于程序期间的参数 k。[注意:因此,对于具有相同 k 值的表达式 h(k) 的所有求值,对于程序的给定执行产生相同的结果。——结束注]

两种不同的执行可以给出不同的哈希值

哈希函数只需要在程序的单次执行中为相同的输入产生相同的结果;这允许防止冲突 DoS 攻击的加盐哈希。

这种行为对于缓解基于哈希冲突的 DoS 攻击很有用。

细节

Hash以下是C++17 标准中关于概念要求的措辞:

返回的值应仅取决于 程序期间的参数 k 。[注意:因此,对于给定的程序执行,具有相同 k 值的表达式 h(k) 的所有计算都会产生相同的结果。——尾注]

它没有明确说明有关随机散列的任何内容。该std::hash文本不强制也不排除随机散列。

历史

这是N3242 2011-02-28 草案,其中没有提到“在计划期间”:

不得抛出异常。返回的值应仅取决于参数 k。[注意:因此,对于具有相同 k 值的表达式 h(k) 的所有评估都会产生相同的结果。——尾注

我们可以看到添加了“在程序的持续时间内”“在给定的程序执行期间”作为“ 2291.std::hash易受碰撞 DoS 攻击”的解决方案。

在实践中

AFAIU,没有实现std::hash随机散列,但您可以编写自己的my::secure_hash.

于 2016-06-20T07:53:59.513 回答