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