【问题标题】:How can I hash bigger text file than 16kB?如何散列大于 16kB 的文本文件?
【发布时间】:2015-06-21 23:12:17
【问题描述】:

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

【问题讨论】:

  • 您在哪里遇到问题?
  • 当我想要散列大于 16kB 的文本时:错误 C2026:字符串太大,尾随字符被截断
  • 这不是编译器错误,它告诉您不能使用那么长的字符串文字吗?在这种情况下,您可以简单地以另一种方式构建字符串,例如通过从文件中读取。

标签: c++ hash cryptography crypto++


【解决方案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 然后取消映射文件。您在上面的ChannelSwitch 上调用PutMessageEnd,因为它是感兴趣的BufferedTransformation

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2019-10-08
    • 2011-08-18
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多