我正在尝试使用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
类可能不是文字友好的。我可以使用更好(或有效)的替代方案吗?
注意:
constexpr
函数中复杂代码的任何方法。答案 0 :(得分:1)
你说编译时。你真的是那个意思吗?这意味着用户定义的字符串文字被声明为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]
是文字类型。