使用 constexpr 和 CryptoPP 的编译时散列

Compile-time hashing with constexpr and CryptoPP

我正在尝试使用 Crypto++ 库和 constexpr 函数在编译时散列一些字符串(不需要检索它们)。这是我到目前为止的代码:

constexpr const char* operator "" _SHA3_HASH(const char *input, unsigned int length){
    CryptoPP::SHA3_512 hash;
    byte digest [CryptoPP::SHA3_512::DIGESTSIZE];
    hash.CalculateDigest(digest, (byte*)input, length);
    return (const char*) digest;
}

待用:std::string passwordHash="password1234"_SHA3_HASH

我认为没有办法让它工作,因为 CryptoPP::SHA3_512 class 可能不是字面友好的。我可以使用更好(或有效)的替代方案吗?

备注:

你说的是编译时。你真的是这个意思吗?这意味着用户定义的字符串文字被声明为 constexpr,这 (AFIAK) 是不可能的(我试过)。

这留下了将 SHA3 哈希重新实现为具有以下签名的 constexpr 模板函数的路线:

template<size_t N>
constexpr custom_digest sha3_hash(const char (&source)[N])
{
   // your constexpr-friendly code goes here
}

请记住,您的 constexpr 函数调用的每个函数也必须是 constexpr(即仅处理文字类型或由其组成的 constexpr 用户类型)。

是的,const char (&)[N]是文字类型。