std :: string_view编译时哈希

Vik*_*ehr 4 c++ hash std string-view c++17

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

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

ysd*_*sdx 8

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

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

两种不同的执行可以提供不同的哈希:

哈希函数只需要在一次执行程序时为同一输入产生相同的结果; 这允许盐渍哈希防止碰撞DoS攻击.

此行为可用于缓解基于哈希冲突的DoS攻击.

细节

以下是关于HashC++ 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.

  • 不幸的是,最后一句话根本不正确。该标准确实要求该值仅取决于给定程序执行的参数,是的。但是,这是因为某些实现只是将指针转换为哈希值。其他实现(例如GCC)在运行时使用带有内置常量种子的FNV1可以按字节逐个哈希,因此在实践中不存在随机哈希。因此,该标准给我们带来了两个世界中最糟糕的情况:没有可预测的输出值,没有constexpr,并且同时没有可靠的不可预测的输出值。 (2认同)