我正在使用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;
答案 0 :(得分:1)
当我使用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++ Source,但事情就会奏效。
其次,您可以将文件视图映射到流程中,然后在循环中重复调用Put
。完成文件中所有数据的使用后,请调用MessageEnd
,然后取消映射文件。您在上面的Put
上致电MessageEnd
和ChannelSwitch
,因为感兴趣的是BufferedTransformation
。
在Windows上,使用MapViewOfFile映射文件的视图。在Linux上,您使用mmap(2)。
映射文件视图时,您将有效地拥有磁盘支持的内存中字节数组。在这种情况下,您可以使用ArraySource
代替StringSource
或FileSource
。