Node.js:是否使用 Crypto 模块完全异步创建 MD5 哈希?

Igo*_* P. 1 cryptography asynchronous node.js

考虑到 Node 11 环境中的这段代码并使用标准加密模块,我有两个问题(为了避免任何误解:我只是根据字符串计算 MD5 哈希值 - 没有加密,没有敏感数据):

exports.calculateSomeHash = function(somestring, cb){
    var somehash = crypto.createHash('md5').update(somestring).digest('hex').toString();
    cb(null, somehash);   
};
Run Code Online (Sandbox Code Playgroud)

1)calculateSomeHash() 是否可以返回一个空的(somehash)值,因为一旦回调被触发,哈希计算可能不会完全完成?

2)Node的crypto模块的这个散列算法是完全异步和非阻塞的吗?如果没有,关于替代使用什么的任何建议?比如哈希呢?

jfr*_*d00 5

所有这些方法都是阻塞和同步的:

crypto.createHash()
hash.update()
hash.digest()
.toString()
Run Code Online (Sandbox Code Playgroud)

因此,您的结果将完全同步。您根本不必使用回调来传达结果。您可以直接返回结果:

exports.calculateSomeHash = function(somestring){
    return crypto.createHash('md5').update(somestring).digest('hex').toString();
};
Run Code Online (Sandbox Code Playgroud)

仅供参考,加密库确实有一些异步方法,但这些不是异步方法。

calculateSomeHash() 是否可以返回一个空的(somehash)值,因为一旦回调被触发,哈希计算可能不会完全完成?

不,它们是同步的。他们没有与时间相关的问题。

Node 的加密模块的这种散列算法是完全异步和非阻塞的吗?

不。这是同步和阻塞的。这对您是否重要可能取决于数据的大小。

内置的加密模块似乎没有内置到 node.js 中的异步哈希选项。因为散列纯粹是 CPU 工作,使它们非阻塞和异步的唯一方法是在本机代码中使用本机线程、使用 WorkerThread 或使用 child_process。所有这些选项都会产生通常不需要的额外开销。但是,如果这对你来说真的是个问题,你可以启动一个 WorkerThread,然后向它发送一个你想要散列的字符串,它可以向你发送回散列值。

您可以查看具有一些异步散列的bcrypt 模块,但它的功能并不完全相同,因此您必须查看它是否符合您的需求。

  • @伊戈尔P。- 然后,一次与其他处理混合同步进行一项处理就完全没问题了。你根本不会注意到这一点。计算 URL 的哈希值非常非常快。 (2认同)