【问题标题】:Node.js: Pipe ouput of request into crypto.hashNode.js:将请求的输出通过管道传输到 crypto.hash
【发布时间】:2016-03-17 18:35:59
【问题描述】:

我想从 URL 计算资源(例如 PDF)的哈希值。为此,我写了

const computeHash = co.wrap(function* main(url) {
  const response = yield promisify(request)(url);
  // assume response.status === 200
  const buf = new Uint8Array(response.arrayBuffer);
  const hash = crypto.createHash('sha1');
  hash.update(buf, 'binary');
  return hash.digest('hex');
});

使用

const hash = yield computeHash('http://arxiv.org/pdf/1001.1234v3.pdf');

我喜欢代码的地方:

  • 它是一个生成器,所以我可以yield 它。距离async/await 仅一步之遥。

我不喜欢的:

  • 它没有正确计算散列。 :)
  • request 已完成,响应主体作为一个整体通过管道传输到hash 函数中。 我宁愿将request 的输出通过管道传输到哈希函数中。

有什么提示吗?

【问题讨论】:

  • 你怎么知道它没有正确计算哈希?你要对比什么?
  • sha1sum 在本地计算。无论 url 是什么,它总是计算相同的哈希值。

标签: javascript node.js hash cryptography request


【解决方案1】:

crypto.createHash() 提供了一个 Hash 实例,该实例当前支持两个接口:旧版(update()digest())和流式传输。您不需要做任何特别的事情来使用其中任何一个,因此将响应流式传输到哈希流很简单:

var hasher = crypto.createHash('sha1');
hasher.setEncoding('hex');
request(url).pipe(hasher).on('finish', function() {
  console.log('Hash is', hasher.read());
});

这就是您使用普通回调的方式,但我不确定您将如何处理yield,因为我对生成器等不够熟悉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多