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

Compile-time hashing with constexpr and CryptoPP

本文关键字:编译 constexpr CryptoPP 使用      更新时间:2023-10-16

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

笔记:

  • 如果可能的话,我更喜欢使用加密++库
  • SHA3 会很好,但任何安全哈希都可以
  • 如果我无法编译时哈希,我有什么替代方案?
  • 我已经环顾了一下可能的重复项,但似乎没有一个揭示constexpr函数中复杂代码的任何方法。
  • 我正在使用Qt创建器中的内置编译器,它是MinGW 32位。

你说编译时。你真的是这个意思吗?这意味着用户定义的字符串文字被声明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]是文字类型。