javascript - Node.js:将请求的输出通过管道传输到 crypto.hash

标签 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 仅一步之遥。

我不喜欢的地方:

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

有什么提示吗?

最佳答案

crypto.createHash() 提供了一个 Hash当前支持两个接口(interface)的实例:遗留(update()digest())和流式传输。您无需执行任何特殊操作即可使用其中任何一个,因此将响应流式传输到哈希流非常简单:

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

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

关于javascript - Node.js:将请求的输出通过管道传输到 crypto.hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230461/

相关文章:

javascript - 无法访问条件语句内的循环内的数组或对象值/循环未启动

typescript - 如何检查 Typescript 中的 HashMap 是否为空

function - 有没有温和的哈希函数教程?

hash - 确定只使用sha1哈希的64位作为ID?

javascript - 嵌套查询 - 未定义错误

javascript - 通过node js上传到dropbox失败

javascript - 无法覆盖 CSS 伪元素 :before

javascript - axios 请求拦截器错误处理程序中错误对象的形状是什么?

node.js - npm -v 和 node.js 在交叉编译的 nodejs0.12.2 上抛出非法指令

c++ - 我可以将 Node.js C++ 扩展链接到 Node 的内部 OpenSSL 实现吗?