nodejsencryption模块,hash.update()将所有input存储在内存中

我有一个API路由代理从浏览器/客户端上传到AWS S3的file upload。

此API路由尝试在上传文件时对其进行stream式传输,以避免在服务器上caching文件的全部内容。

但是,路由也会尝试计算文件正文的MD5校验和。 随着文件的每个部分被分块, hash.update()方法被调用w / chunk。

http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding

 var crypto = require('crypto'); var hash = crypto.createHash('md5'); function write (chunk) { // invoked many times as file is uploaded hash.update(chunk); } function done() { // will hash buffer all chunks in memory at this point? hash.digest('hex'); } 

Hash的实例是否会缓冲文件的所有内容以执行散列计算(从而破坏了避免caching整个文件内存的目标)? 或者可以递增地计算MD5散列,而不需要整个input可用于执行计算?

MD5和其他一些哈希函数是基于Merkle-Damgård构造的 。 它支持数据的增量/渐进/stream式哈希。 在将数据转换为内部状态(具有固​​定大小)之后,执行最后的终止步骤以通过将内部状态压缩成较小的字节数组来生成最终的散列。

这也可能是为什么很多哈希库函数是以更新和最终化步骤的方式devise的。

回答你的问题: 不,文件内容不保存在缓冲区中,而是转换成固定大小的内部状态。