使用constexpr和CryptoPP进行编译时散列

时间:2016-03-10 14:15:28

标签: c++ hash compile-time-constant

我正在尝试使用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类可能不是文字友好的。我可以使用更好(或有效)的替代方案吗?

注意:

  • 我更愿意使用Crypto ++库,如果可能的话
  • SHA3会很好,但任何安全散列都可以
  • 如果我不能编译时哈希,我的替代方案是什么?
  • 我查看了可能的重复项,但似乎没有任何方法可以揭示constexpr函数中复杂代码的任何方法。
  • 我在Qt创建器中使用内置编译器,它是MinGW 32位。

1 个答案:

答案 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]是文字类型。