使用 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 可能不是字面友好的。我可以使用更好(或有效)的替代方案吗?
备注:
- 如果可能的话,我更愿意使用 Crypto++ 库
- SHA3 会很好,但任何安全散列都可以
- 如果我不能编译时哈希,我有什么选择?
- 我查看了可能的重复项,但 none 似乎揭示了
constexpr
函数中复杂代码的任何方法。
- 我正在使用 Qt Creator 中的内置编译器,它是 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]
是文字类型。
我正在尝试使用 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 可能不是字面友好的。我可以使用更好(或有效)的替代方案吗?
备注:
- 如果可能的话,我更愿意使用 Crypto++ 库
- SHA3 会很好,但任何安全散列都可以
- 如果我不能编译时哈希,我有什么选择?
- 我查看了可能的重复项,但 none 似乎揭示了
constexpr
函数中复杂代码的任何方法。 - 我正在使用 Qt Creator 中的内置编译器,它是 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]
是文字类型。