如何散列比 16kB 更大的文本文件

How can I hash bigger text file than 16kB?

本文关键字:文本 文件 何散列 16kB      更新时间:2023-10-16

我正在使用Crypto++库进行哈希处理。如何散列大于 16kB(字符串大小)的文件?我想要至少像 1Mb 这样的哈希文件。

我得到的错误是当文本大于 16kB 时:

error C2026: string too big, trailing characters truncated

这是我正在使用的代码:

std::string hash;
CryptoPP::SHA512 sha;
CryptoPP::StringSource ss(source, true,
                          new CryptoPP::HashFilter(sha,
                              new CryptoPP::HexEncoder(
                                  new CryptoPP::StringSink(hash))));
cout << "SHA-512 hash: " << hash << endl;

当我使用 Crypto++ 库进行哈希处理时,如何哈希大于 16kB(字符串大小)的文件?我想要至少像 1Mb 这样的哈希文件。

您应该执行以下两项操作之一。首先,使用FileSource而不是StringSource。像这样:

string s1, s2, s3, s4;
SHA1 sha1; SHA224 sha224; SHA256 sha256; SHA512 sha512;
HashFilter f1(sha1, new HexEncoder(new StringSink(s1)));
HashFilter f2(sha224, new HexEncoder(new StringSink(s2)));
HashFilter f3(sha256, new HexEncoder(new StringSink(s3)));
HashFilter f4(sha512, new HexEncoder(new StringSink(s4)));
ChannelSwitch cs;
cs.AddDefaultRoute(f1);
cs.AddDefaultRoute(f2);
cs.AddDefaultRoute(f3);
cs.AddDefaultRoute(f4);
FileSource fs("filename.xxx", true /*pumpAll*/, new Redirector(cs));
cout << Message: " << message << endl;
cout << "SHA-1: " << s1 << endl;
cout << "SHA-224: " << s2 << endl;
cout << "SHA-256: " << s3 << endl;
cout << "SHA-512: " << s4 << endl;

通常,您可以交换任何Crypto++源,事情就会正常工作。

其次,可以将文件的视图映射到进程中,然后在循环中重复调用Put。使用完文件中的所有数据后,调用MessageEnd,然后取消映射该文件。您打电话给Put并在上面的ChannelSwitchMessageEnd,因为这是感兴趣的BufferedTransformation

在 Windows 上,您可以使用 MapViewOfFile 映射文件的视图。在 Linux 上,您可以使用 mmap(2)。

映射文件视图时,将有效地拥有由磁盘支持的内存中字节数组。在这种情况下,您将使用 ArraySource 而不是 StringSourceFileSource