我正在寻找最快的SHA1实现,因为我必须计算它数百万次。我尝试了boost::uuids::detail::sha1和OpenSSL SHA1,我发现OpenSSL比boost快2.5倍。我还检查了Crypto++,它比其他两个慢得多。下面是我检查它们性能的方法:
开放SSL 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;
}
}
增强::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;
}
}
加密PP::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 ++功能?
我们欢迎您提供任何有助于改进性能的反馈。
1条答案
按热度按时间kwvwclae1#
我最近的实验证实了openssl是几个中最快的(包括Crypto++和一些丢失的单源C实现,我忘记了是哪一个)
回复:问题的代码评审类型部分:
遵守过程接口还可以允许您使用reset/clear成员(从内存中引用)
应该是一个简单的
甚至
改进的台架代码
结合上述内容和其他内容(主要围绕良好的风格、避免指针错误、显示有效的迭代以及允许
dump
检查摘要的准确性):**一个
图纸:
或在线(没有Crypto++):
这是一个重大的进步,但同样的赢家。