如何在不依赖已弃用的node.js功能的情况下输出文件哈希的多个编码



目标是输出文件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"));
});

相关内容

  • 没有找到相关文章

最新更新