我正在寻找最快的SHA1实现,因为我需要计算数百万次。我尝试了boost::uuids::detail::sha1和OpenSSL SHA1,我发现OpenSSL比boost快2.5倍。我还检查了Crypto++,但它比其他两个要慢得多。以下是我用来检查它们性能的方法:
OpenSSL SHA1:
#include "openssl/sha.h"
void sha1_ossl (const unsigned char* data) {
unsigned char hash[20];
for (long i=0; i<100000000; ++i) {
SHA1(data, 64, hash);
if ((unsigned int)hash[0]==0 && (unsigned int)hash[1]==0 && (unsigned int)hash[2]==0 && (unsigned int)hash[3]==0)
break;
}
}
Boost::SHA1:
#include <boost/uuid/detail/sha1.hpp>
void sha1_boost (const unsigned char* data) {
boost::uuids::detail::sha1 sha1;
unsigned hash[5];
for (long i=0; i<100000000; ++i) {
sha1.process_bytes(data, 64);
sha1.get_digest(hash);
sha1.reset();
if (hash[0]==0) break;
}
}
CryptoPP::SHA1:
#include <cryptopp/sha.h>
#include <cryptopp/hex.h>
void sha1_cryptoPP (const unsigned char* data) {
std::string data_s (reinterpret_cast<char const*>(data));
std::string hash_hex;
CryptoPP::SHA1 sha1;
for (long i=0; i<100000000; ++i) {
CryptoPP::StringSource ss(data_s, true, new CryptoPP::HashFilter(sha1, new CryptoPP::HexEncoder(new CryptoPP::StringSink(hash_hex))));
if (hash_hex.starts_with("00000000")) break;
}
}
然后我使用随机数据测试这些函数:
int main() {
const unsigned char data[65] = "tJQVfvcjGMNIvJfowXBjmSRcKtSjCcyQvaAdakfEJtgSNZHnOHCjkzGFwngiLFPm";
sha1_boost (data);
sha1_ossl (data);
sha1_cryptoPP (data);
}
性能结果
我使用g++ -O3 -std=c++2a
编译了所有的代码,得到以下结果。我发现OpenSSL比其他实现更快,而Crypto++最慢:
问题
- 哪种SHA1实现是最快的?
- 如何改进我的Crypto++函数?
欢迎提供任何改进性能的反馈。