如何散列大于 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
上调用 Put
和 MessageEnd
,因为它是感兴趣的 BufferedTransformation
。
在 Windows 上,您将文件视图映射为 MapViewOfFile. On Linux, you use mmap(2)。
映射文件视图时,您将有效地拥有一个由磁盘支持的内存中字节数组。在这种情况下,您将使用 ArraySource
而不是 StringSource
或 FileSource
.
我正在使用 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
上调用 Put
和 MessageEnd
,因为它是感兴趣的 BufferedTransformation
。
在 Windows 上,您将文件视图映射为 MapViewOfFile. On Linux, you use mmap(2)。
映射文件视图时,您将有效地拥有一个由磁盘支持的内存中字节数组。在这种情况下,您将使用 ArraySource
而不是 StringSource
或 FileSource
.