【发布时间】:2019-03-31 21:36:43
【问题描述】:
我有一个大文件需要散列,但如果我直接从文件中散列它,我的内存是有限的。我想分 2 步而不是 1 步进行散列。例如,我首先使用算法CRC32 将文件散列在块中并存储在字符串中。并执行第二步再次哈希到SHA256。
目前我成功地在 1 步中散列文件。但它会吃掉内存,如果内存不足,最终会返回错误或崩溃。
为了在循环while中使用cpu不会太高。我决定选择 1048576 Bytes(1MB) 作为块。在这个测试中,我的控制台不返回 crc32 哈希。
CRC32 hash;
std::string str;
FileSource file("D:/1.exe", false, new HashFilter(hash, new HexEncoder(new StringSink(str))), true);
while (!file.SourceExhausted())
{
file.Pump(1048576);
}
std::cout << str;
getchar();
return 0;
【问题讨论】:
-
您正在耗尽内存,因为您将整个文件存储在字符串中。只需删除
new CryptoPP::HexEncoder(new CryptoPP::StringSink(str))即可解决问题。 -
@zett42 否,如果使用默认的 true 别名 PumpAll。它只返回 8 个长度的字符。真正的问题是在散列之前它需要将整个字节加载到内存而不是散列。所以我选择假第二个参数。但我不知道如何将值从文件源传递到 while 并进行缓冲区转换
-
@zett42 进行测试,我选择了一个 2MB 大小的文件 1.exe。因此它将循环两次并生成 2 个 crc32 哈希并组合成 1 个字符串。这就是我想要的。但文档如此泄漏示例。
-
首先散列到 CRC32,然后将结果散列到 SHA-256 是不安全的,所以我不确定你在这里尝试完成什么。
-
@kelalaka 那是关于 NaCl,一个完全不同的库。请仔细检查一个骗子是否真的是一个骗子:你不能指望有人因为一个功能而切换库;应该可以在不使用 Crypto++ 将所有内容加载到内存的情况下对文件进行 SHA-256 处理。
标签: c++ hash cryptography crypto++