似乎 C++17 string_view 的std::hash 函数不是 constexpr 的。
在我看来,绑定到 const char[] 的字符串视图可以在编译时进行散列(这会非常好),或者有什么可以防止这种情况发生吗?
似乎 C++17 string_view 的std::hash 函数不是 constexpr 的。
在我看来,绑定到 const char[] 的字符串视图可以在编译时进行散列(这会非常好),或者有什么可以防止这种情况发生吗?
从 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
.