Node.js:将请求输出到crypto.hash

时间:2015-12-11 18:45:39

标签: javascript node.js hash cryptography request

我想从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的输出传递给哈希函数。

任何提示?

1 个答案:

答案 0 :(得分:2)

crypto.createHash()提供了一个Hash实例,目前支持两个接口:legacy(update()digest())和流。您无需执行任何特殊操作即可使用任何一个,因此要将响应流式传输到散列流,它就像以下一样简单:

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

这就是你用普通回调做的方式,但我不确定你是如何工作yield的,因为我对发电机等不够熟悉。