【发布时间】:2020-06-19 10:20:34
【问题描述】:
此后,我们使用N4140(C++14 标准)。
根据§ 17.6.3.4 哈希要求,
返回的值应仅取决于参数
k在项目期间。[ 注意:因此,表达式
h(k)的所有计算都具有相同的值k对于给定的程序执行产生相同的结果。 ——尾注]
和 §20.9.12 类模板哈希说
...
实例化
hash<Key>应:(1.1) — 满足哈希要求 (17.6.3.4) ...
(1.2) — ...
这意味着如果您重新启动程序,value(即hash<decltype(value)>(value))的哈希值可能会采用不同的值。
但是为什么呢?此限制不在 C++11 标准中,而是在 C++14、C++17 和 C++20 标准中。作为用户(不是 STL 开发人员),如果 std::hash 是确定性的,那将非常有用。实现确定性哈希函数是否有任何数学困难?但是我们日常使用的散列函数(例如已弃用的md5sum 或更安全的sha256)都是确定性的。效率有问题吗?
【问题讨论】:
-
"...哈希函数只需要在程序的单次执行中为相同的输入产生相同的结果;这允许防止冲突拒绝的加盐哈希-服务攻击。”来源:en.cppreference.com/w/cpp/utility/hash
-
它允许确定性算法采用非确定性输入。例如,指针值。不可变的数据结构可以散列其内部数据的地址,这可能比散列内容快得多。
-
This answer 提供了一些很好的链接,说明您为什么不想要确定性。
-
不要威胁这是限制,而是让标准约束不那么严格。
-
这里是full explanation why 约束已经放宽了。
标签: c++ hash language-lawyer std