如何散列比 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;
当我使用 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
并在上面的ChannelSwitch
上MessageEnd
,因为这是感兴趣的BufferedTransformation
。
在 Windows 上,您可以使用 MapViewOfFile 映射文件的视图。在 Linux 上,您可以使用 mmap(2)。
映射文件视图时,将有效地拥有由磁盘支持的内存中字节数组。在这种情况下,您将使用 ArraySource
而不是 StringSource
或 FileSource
。
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 已修改的LinkedList未在文本文件本身中更新
- C++文本文件的获取线
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 打印逐行存储的文本文件
- C++文本文件输入