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
}
关于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
}