在性能方面,有没有比crypto.randomBytes更好的方法来生成唯一ID?

时间:2018-10-03 12:20:19

标签: javascript node.js

Node.js文档强烈建议不要使用crypto.randomBytes()。但是,正如我在StackOverflow的答案中所读到的那样,在所有随机字符串生成方法(例如使用时间戳记)中,实现最高熵的最佳方法是crypto.randomBytes()

我想使用这种uuid策略在我的node.js系统中生成验证密钥。在性能方面还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用npm软件包uuid

示例:

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '0b3e4d7a-1c48-4fb7-ba10-e054f99aacfb'

生成随机字符串在CPU上总是很昂贵的任务,但是guid比crypto.randomBytes()更好。

或者您可以使用以下内容生成它

 Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10);

但这不建议。

请在awesome gist之后关注joepie91,以了解更多详细信息。

答案 1 :(得分:0)

如果您想使用CSPRNG,不是真的。

建议使用uuid,但它仅调用crypto.randomBytes(16)并将其转换为十六进制字符串。 randomBytes阻塞并不是真正的问题,因为它还提供了异步api(第二个arg是回调函数)。但是,当生成少量数据时,使用同步API可能会更快。

文档do still mention缺少熵可能会导致比平常更长的阻塞时间。但这只是在启动后立即出现的问题,即使在那种情况下,也可以通过使用异步api来避免阻塞。

  

除非有足够的熵可用,否则crypto.randomBytes()方法将不会完成。通常,这应该不会花费超过几毫秒的时间。可以想象,生成随机字节的唯一时间可能是在引导后立即阻塞更长的时间,而此时整个系统的熵仍然很低。