声明相同类型的变量并重用它们
Declaring variables of same type and reusing them
我有以下情况,想知道是否有好的解决方案。
我正在使用 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<>
的共同基础 class 是 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(...)
我有以下情况,想知道是否有好的解决方案。
我正在使用 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<>
的共同基础 class 是 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(...)