【发布时间】:2018-07-31 10:58:52
【问题描述】:
我想我会尝试通过散列选择不同的选项作为字符串,但这不起作用:
#include <type_traits>
#include <string>
inline void selectMenuOptionString(const std::string& str)
{
switch (std::hash<std::string>()(str))
{
case std::hash<std::string>()(std::string("Selection one")) : break;
// Expression must have a constant value
}
}
inline void selectMenuOptionString2(const std::string& str)
{
size_t selectionOneHash = std::hash<std::string>()(std::string("Selection one"));
switch (std::hash<std::string>()(str))
{
case selectionOneHash: // Expression must have a constant value
// The variable of selectionOneHash cannot be used as a constant
}
constexpr size_t hash = std::hash<int>()(6); // Expression must have a constant value
}
似乎我无法在编译时获取哈希值。从我读过的内容来看,每个不同的输入每次都应该产生相同的独特输出,碰撞的可能性非常低。鉴于这些属性不能在编译时计算哈希值吗?我对哈希一无所知,我通常使用 unordered_map,但为了学习,我想尝试一些新的东西。
【问题讨论】:
-
std::hash在运行时进行评估。它不能用于编译时散列。 -
A 哈希值原则上可以在编译时计算,但标准库中的
std::hash当前未指定为constexpr,因此不能。此外,您目前无法创建std::string常量表达式(因为还没有 constexproperator new)。面向未来的最佳选择可能是考虑std::hash<std::string_view>,但我们还没有这个constexpr。 -
你当然可以复制
std::hash<std::string>::operator()的实现并将其粘贴到 constexpr 函数中。 -
相关:Compile time string hashing,但这是针对 C++11 的;使用 C++14 或 C++17,我们可以做得更好。
-
@Kerrek 这很有趣,我一直在看,它基本上是在循环中为数组重复的两行:_Val ^= (size_t)_First[_Next];和 _Val *= _FNV_prime;
标签: c++ hash compile-time-constant