我想根据 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/