boost SHA1 哈希与 md5sum/sha1sum 的运行时比较
runtime comparison of boost SHA1 hashing with md5sum/sha1sum
我使用 Boost 计算 SHA1 哈希,然后用 Linux 命令 md5sum
和 sha1sum
比较朗姆酒时间。文件大小为28G。 md5sum
和 sha1sum
都是 8.4 版本。
这就是我使用 Boost 计算 SHA1 的方式:
void Sha1_Key(const std::string& inputfilename_, uint32_t* inputfile_sha1)
{
std::string sha1_key_string;
uint32_t local_sha1[5];
for (uint32_t i = 0; i < 5; ++i)
{
inputfile_sha1[i] = local_sha1[i] = 0;
}
std::ifstream ifs(inputfilename_,std::ios::binary);
boost::uuids::detail::sha1 sha1;
std::stringstream sha1_key;
char buf[128*1024];
clock_t begin = clock();
while(ifs.good()) {
ifs.read(buf,sizeof(buf));
sha1.process_bytes(buf,ifs.gcount());
}
ifs.close();
sha1.get_digest(local_sha1);
for(std::size_t i=0; i<sizeof(local_sha1)/sizeof(local_sha1[0]); ++i) {
sha1_key<<std::hex<<local_sha1[i];
inputfile_sha1[i] = local_sha1[i];
}
sha1_key_string = sha1_key.str();
clock_t end = clock();
std::cout << "run time for Boost SHA1: " << double(end - begin)/CLOCKS_PER_SEC << " sec";
}
这是运行时间比较:
提升 SHA1:170s
md5sum: 54.719s
sha1sum: 81.795s
sha1sum
的复杂度比md5sum
高,所以sha1sum
多花50%的时间。但是Boost SHA1方法运行的时间是Linuxsha1sum
的两倍。为什么?
我可以改进我的代码吗?或者对使用其他哈希方法有什么建议吗?
boost::uuids::detail::sha1 sha1;
看到了吗? ::detail::
就在那里告诉你你正在滥用一个未记录的实施细节,它不适合你使用。
SHA 实现支持 UUID 生成,并不是为了快速消化大型顺序流而设计的。
就这些了。
使用正确的 sha1 实现(libcrypto、cryptoc++ 等)
- Generate SHA hash in C++ using OpenSSL library
- Using Crypto++ to generate random hashes with SHA1
我使用 Boost 计算 SHA1 哈希,然后用 Linux 命令 md5sum
和 sha1sum
比较朗姆酒时间。文件大小为28G。 md5sum
和 sha1sum
都是 8.4 版本。
这就是我使用 Boost 计算 SHA1 的方式:
void Sha1_Key(const std::string& inputfilename_, uint32_t* inputfile_sha1)
{
std::string sha1_key_string;
uint32_t local_sha1[5];
for (uint32_t i = 0; i < 5; ++i)
{
inputfile_sha1[i] = local_sha1[i] = 0;
}
std::ifstream ifs(inputfilename_,std::ios::binary);
boost::uuids::detail::sha1 sha1;
std::stringstream sha1_key;
char buf[128*1024];
clock_t begin = clock();
while(ifs.good()) {
ifs.read(buf,sizeof(buf));
sha1.process_bytes(buf,ifs.gcount());
}
ifs.close();
sha1.get_digest(local_sha1);
for(std::size_t i=0; i<sizeof(local_sha1)/sizeof(local_sha1[0]); ++i) {
sha1_key<<std::hex<<local_sha1[i];
inputfile_sha1[i] = local_sha1[i];
}
sha1_key_string = sha1_key.str();
clock_t end = clock();
std::cout << "run time for Boost SHA1: " << double(end - begin)/CLOCKS_PER_SEC << " sec";
}
这是运行时间比较:
提升 SHA1:170s
md5sum: 54.719s
sha1sum: 81.795s
sha1sum
的复杂度比md5sum
高,所以sha1sum
多花50%的时间。但是Boost SHA1方法运行的时间是Linuxsha1sum
的两倍。为什么?
我可以改进我的代码吗?或者对使用其他哈希方法有什么建议吗?
boost::uuids::detail::sha1 sha1;
看到了吗? ::detail::
就在那里告诉你你正在滥用一个未记录的实施细节,它不适合你使用。
SHA 实现支持 UUID 生成,并不是为了快速消化大型顺序流而设计的。
就这些了。
使用正确的 sha1 实现(libcrypto、cryptoc++ 等)
- Generate SHA hash in C++ using OpenSSL library
- Using Crypto++ to generate random hashes with SHA1