我有以下情况,想知道是否有一个好的解决方案。
我正在使用Crypto++并声明以下内容:
if (_HashType == SHA1)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA256)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA384)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
pbkdf.DeriveKey(...)
}
else if (_HashType == SHA512)
{
PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
pbkdf.DeriveKey(...)
}
我想做的是这样的:
PKCS5_PBKDF2_HMAC<?> pbkdf;
if (_HashType == SHA1)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
else if (_HashType == SHA256)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
else if (_HashType == SHA384)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
else if (_HashType == SHA512)
PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
pbkdf.DeriveKey(...)
有什么建议吗?
最佳答案
PKCS5_PBKDF2_HMAC<>
的公共(public)基类是 PasswordBasedKeyDerivationFunction
,所以你可以做的是:
PasswordBasedKeyDerivationFunction* pbkdf;
if (_HashType == SHA1)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>();
else if (_HashType == SHA256)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>();
else if (_HashType == SHA384)
pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>();
else if (_HashType == SHA512)
pbkdf = PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>();
pbkdf->DeriveKey(...)
//...
delete pbkdf;
如果您使用的是C++11或更高版本,则可以使用智能指针,而不必担心内存管理:
std::unique_ptr<PasswordBasedKeyDerivationFunction> pbkdf;
if (_HashType == SHA1)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>());
else if (_HashType == SHA256)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>());
else if (_HashType == SHA384)
pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>());
else if (_HashType == SHA512)
pbkdf.reset(PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>());
pbkdf->DeriveKey(...)
关于c++ - 声明相同类型的变量并重用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33242428/