如何散列大于 16kB 的文本文件?

How can I hash bigger text file than 16kB?

我正在使用 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;

When I'm using Crypto++ library for hash how can I hash bigger file than 16kB (string size)? I want hash files like 1Mb at least.

你应该做以下两件事之一。首先,使用 FileSource rather than a 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++ Source,一切都会正常进行。

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

在 Windows 上,您将文件视图映射为 MapViewOfFile. On Linux, you use mmap(2)

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