C ++ Tweetnacl将没有读取整个文件的文件哈希到内存中
我正在使用tweetnacl生成sha512字符串和文件的哈希值。 对于字符串,它工作得很好,但我不知道如何使用文件。
函数的签名是
extern "C" int crypto_hash(u8 *out, const u8 *m, u64 n);
其中u8的类型为unsigned char,而u64的长度为unsigend。 对于字符串,a可以像这样使用它
string s("Hello"); unsigned char h[64]; crypto_hash(h, (unsigned char *)s.c_str(), s.size());
这适用于字符串和小文件,但如果我想为一个大文件创建一个哈希,它是不可行的并且用于大量内存。 我搜索一个逐字节读取文件的解决方案,并将其作为unsigend char指针传递给该函数。 有谁知道如何实现这一目标?
PS抱歉英语不好。 pss我使用tweetnacl因为体积小而且我只需要散列函数。
我建议你使用不同的实现,你可以逐步提供块。
例如这一个 。 由于许可证是bsd且代码是C而没有依赖关系,因此您只需复制/粘贴所需的3个函数,而无需将整个库(无论多小)添加到项目中。
生命周期如下:
-
sha256_init(&ctx)
-
从文件中反复读取块并将它们送入
sha256_update(&ctx, buff, buffLen)
-
当EOF时,使用
sha256_final(&ctx, digestHere)
获取你的摘要sha256_final(&ctx, digestHere)
可能最简单的方法是使用内存映射文件 。 这使您可以打开文件并将其映射到虚拟内存,然后您可以将磁盘上的文件视为内存,操作系统将根据需要加载页面。
因此,在您的情况下,打开您的文件并使用mmap()
将其映射到内存中。 然后你可以将指针传递给你的crypto_hash()
函数,让操作系统完成工作。
请注意,有些警告与文件的大小有关。
对于各种平台:
- 提升进程
- macOS和
mmap
- Linux和
mmap
- Windows .NET MemoryMappedFile