在编译时计算“const char *”字符串哈希值

问题描述 投票:0回答:1

我有一个计算字符串文字的哈希值的函数:

inline consteval uint64_t HashLiteral(const char* key)
{
   // body not important here...
   return 0;
}

在另一个函数中,我需要文字字符串及其哈希值,我想在编译时计算它:

void function(const char* s)
{
   worker(s, HashLiteral(s));
}

然而,似乎不可能进行像

function("string")
这样的调用并在编译时在其主体中计算哈希值。我现在想到的最好方法是使用宏,并重新定义函数:

#define MakeHashParms(s)   s,HashLiteral(s)
void function(const char* s, const uint64_t hash)
{
   worker(s, hash);
}
function(MakeHashParms("string"));

是否可以有更直接的解决方案?

c++ constexpr consteval
1个回答
0
投票

当然可以:例如:

template <size_t N>
constexpr unsigned int foo_hash(const char(&s)[N]) {
    // simple hash
    unsigned int h{};
    for (const auto& c : s)
        h = 2 * h ^ c;
    return h;
}

int main()
{
    constexpr unsigned int hash = foo_hash("abc");
    return hash;
}

您还可以使用

std::vector
和/或
std::string
使 has 函数变得复杂。只需将其保留在 constexpr 函数内部即可。

© www.soinside.com 2019 - 2024. All rights reserved.