似乎C ++ 17 string_view的std::hash functions不是constexpr的。
在我看来,绑定到const char []的字符串视图可以在编译时进行散列(这将非常甜蜜),或者有什么可以防止这种情况?
答案 0 :(得分:8)
从C ++ 14开始(参见17.6.3.4哈希要求,表26),我们有:
返回的值仅取决于持续时间的参数k 该计划。 [注:因此所有表达式h(k)的评估都与 对于给定的执行,k的相同值得出相同的结果 程序的。 - 结束说明]
两个different executions can give different hashes:
哈希函数只需要产生相同的结果 同一输入在程序的单个执行中; 这允许盐渍化的哈希防止碰撞DoS攻击。
This behaviour is useful可以缓解hash collision-based DoS attacks。
这里是关于C ++ 17标准中Hash
概念要求的措辞:
返回的值仅取决于参数k 在该计划的持续时间。 [注意:因此全部 用相同的方法评估表达式h(k) k的值产生相同的结果 给定的程序执行。 - 结束说明]
它没有明确说明随机散列的任何内容。 std::hash
文本不强制要求,也不排除随机散列。
此处的N3242 2011-02-28草案未提及“在计划期间”:
不要抛出异常。返回的值应取决于 关于论证k。 [注:因此对表达式h(k)的所有评估 使用相同的k值得到相同的结果。 - 结束说明
我们可以看到在节目的持续时间内添加"" "对于给定的程序执行"已被添加为" 2291. std::hash is vulnerable to collision DoS attack"。
的分辨率 AFAIU,std::hash
的实现没有实现随机散列,但您可以编写自己的my::secure_hash
。