2015-10-20 117 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

在這種情況下無關緊要。您始終可以使用相應的類型調用單獨的函數。 –

相關問題