await bcrypt.hash()和bcrypt.hashSync()是相同的吗?

4
关于bcrypt npm包,我看到建议使用异步版本。但是,我想真正了解两个版本在性能方面(即事件循环、阻塞I/O等)的区别。
版本1:异步
const hash = await bcrypt.hash(...)
...

版本2:同步

const hash = bcrypt.hashSync(...)
...

换句话说,如果我使用await调用bcrypt.hash,效果是否等同于同步版本?
3个回答

3
同步和异步版本的区别在于它们使用底层的同步和异步盐生成。因此,异步熵收集。

对于异步哈希,哈希计算会被转移到一个工作线程中。

因此,使用异步确实会有所不同,并避免阻塞 Node 事件循环。这是需要注意的。具体代码可以参考:https://github.com/kelektiv/node.bcrypt.js/blob/7a720bd2e5450f97e64d4a1d4ac23190b1417c65/bcrypt.js#L30 https://github.com/kelektiv/node.bcrypt.js/blob/7a720bd2e5450f97e64d4a1d4ac23190b1417c65/bcrypt.js#L76 https://github.com/kelektiv/node.bcrypt.js/blob/aac593c3922253c732bb62197913a26a8302fbe6/src/bcrypt_node.cc#L216 https://github.com/kelektiv/node.bcrypt.js/blob/aac593c3922253c732bb62197913a26a8302fbe6/src/bcrypt_node.cc#L241

2
我不知道bcrypt的具体实现方式,但如果它得到推荐并确实完全异步,那么意味着它在不同的线程中执行,并且不会阻塞主线程。
在Node.js中,事件循环和您编写的所有代码都在一个线程中 - 一旦开始执行某些操作,同步部分必须先完全执行,这意味着其他所有事情都被阻塞了。 您不想阻止REST API响应,对吗?每毫秒都很重要。

0
您可以使用 bcrypt.hash() 并将其异步执行,如下所示:
bcrypt.hash(password,saltRounds).then(hash)=>{

//run whatever you want here once the operation has completed, such as creating your user
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接