目标是输出文件MD5哈希的base64和十六进制编码,而不依赖于不推荐使用的node.js功能。这意味着使用Hash.read()
代替Hash.digest()
,使用Buffer
实例代替"binary"
编码的字符串。来自文档:
在[Hash]流的可写端结束后,使用read()方法获取计算的哈希摘要还支持传统更新和摘要方法
和
["binary"]编码方法已被弃用,应避免使用以支持Buffer对象在可能的情况下。此编码将在Node的未来版本中删除。
到目前为止,如果不使用这些不推荐使用的功能,我无法在0.10.22中计算多个哈希编码。(从技术上讲,hash.dedigest()并没有被弃用,但我对使用任何标记为legacy的东西持谨慎态度)。
我发现的最好的仍然依赖于"binary"
编码的字符串:
var fs = require("fs"), crypto = require("crypto");
var input = fs.createReadStream("test.txt");
var hash = crypto.createHash("md5");
hash.setEncoding("binary");
input.pipe(hash).on("finish", function() {
var buffer = new Buffer(hash.read(), "binary");
console.log(buffer.toString("hex"));
console.log(buffer.toString("base64"));
});
如果移除了对hash.setEncoding
的调用,那么后续的hash.read()
方法将返回null。也许这是个bug?Kinda需要Buffer的实例。。。
关于如何避免上述不推荐使用的功能,有什么想法吗?
(作为参考,这个问题涵盖了如何计算一个哈希编码,而不是多个编码。)
问题是,"finish"
事件是在input
已完成到hash
对象的管道传输时触发的,而不是在准备读取哈希时触发的。设置编码必须以某种方式更改所遵循的路径,以使"finish"足够晚才能启动,从而使您的示例正常工作。
当有数据要读取时,'readable'
事件将触发,然后您可以从hash
读取,以累积所有哈希块,从而形成一个缓冲区。
你可以使用accum这样的模块,也可以自己绑定监听器:
var input = fs.createReadStream("test.txt");
var hash = input.pipe(crypto.createHash("md5"));
var chunks = [];
hash.on('readable', function() {
var chunk;
while ((chunk = hash.read()) !== null){
chunks.push(chunk);
}
});
hash.on('end', function(){
var buffer = Buffer.concat(chunks);
console.log(buffer.toString("hex"));
console.log(buffer.toString("base64"));
});