如何创建文件的md5或sha1校验和而不将其内容加载到内存?

时间:2012-12-18 12:05:07

标签: c++ winapi md5 checksum sha

我的意思类似于php sha1_file

我发现非常好且紧凑的脚本不需要外部库,如boost:http://code.google.com/p/smallsha1/source/browse/trunk/sha1.cpp

但是当文件大小为10GB时,有没有办法传递给它一个文件流?

2 个答案:

答案 0 :(得分:5)

确切的代码无法获取流,没有。

查看循环while (currentBlock <= endOfFullBlocks)。它通过实际的散列代码一次运行64个字节。因此,为了修改此代码以获取流,您需要从流中读取这64个字节,而不是从sarray(指向与输入src相同的数据)中获取它们。

每次读取64字节读取10GB数据的有效方法,所以实际上你可能想引入第二个循环:一个从文件读取更大的块,一个读取64个字节通过哈希的那些块。

您当然还需要修改代码来处理输入数据的“剩余”部分,该部分不是64的倍数。

或者,使用“init”,“update”,“finish”/“digest”函数找到不同的SHA1实现,然后使用它。这种接口的想法是你可以多次调用“更新”,传入任何大小的数据块,方便阅读你的流。

答案 1 :(得分:0)

对于大文件,您可以将内存映射到文件的一部分,计算总和,重新映射到文件的下一部分并继续求和,依此类推。