await bcrypt.hash() 和 bcrypt.hashSync() 一样吗?

Is await bcrypt.hash() the same as bcrypt.hashSync()?

关于bcrypt npm package,我看到推荐使用异步版本。但是,我想真正了解两个版本在性能方面的差异(即事件循环、阻塞 I/O 等)

版本 1:异步

const hash = await bcrypt.hash(...)
...

版本 2:同步

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

换句话说,如果我用 await 调用 bcrypt.hash,效果是否与同步版本相同?

我不知道 bcrypt 究竟是如何实现的,但如果推荐它并且它是真正完全异步的,这意味着它们在不同的线程中进行并且不会阻塞主线程。

在 Node.js 中,事件循环和您编写的所有代码都在一个线程中 - 一旦您开始做某事,同步部分必须首先完全执行,这意味着其他所有内容都被阻塞。 您不想阻止 REST API 进行响应,对吧?每毫秒都很重要。

同步与异步版本的不同之处在于它们使用底层同步与异步盐生成。所以异步熵收集。

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

所以是的,使用异步确实有所不同,并且会避免阻塞节点事件循环

您可以使用 bcrypt.hash() 并使其异步,如下所示:

bcrypt.hash(password,saltRounds).then(hash)=>{

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