std :: string_view编译时哈希

时间:2016-06-09 08:37:07

标签: c++ hash std c++17 string-view

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

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

1 个答案:

答案 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