2015-10-20 70 views
2

我有以下情况并想知道是否有一个好的解决方案。声明相同类型的变量并重新使用它们

我使用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(...)  

有什么建议?

+0

每个'pbkdf'都是*不同类型*。你不能这样做。 – crashmstr

+0

确实PKCS5_PBKDF2_HMAC有一个共同的基类吗?是你的还是图书馆(你可以改变它吗?) – pm100

+0

@Adviner - 另请参阅[责任链模式](https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern)和[策略模式](https://en.wikipedia.org/wiki/Strategy_pattern)。 (我认为他们是可能帮助你的模式)。 – jww

回答

2

PKCS5_PBKDF2_HMAC<>的公共基类是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(...) 
+2

尽管可能,但在这个特定情况下,这不是一个很好的解决方案。为需要的地方保留动态分派,否则使用静态分派。 –

+0

@KonradRudolph肯定,但我们不知道'_HashType'是一个运行时变量还是编译时间常量 –

+0

在这种情况下无关紧要。您始终可以使用相应的类型调用单独的函数。 –