如何用node.js生成唯一的ID

function generate(count) { var founded = false, _sym = 'abcdefghijklmnopqrstuvwxyz1234567890', str = ''; while(!founded) { for(var i = 0; i < count; i++) { str += _sym[parseInt(Math.random() * (_sym.length))]; } base.getID(string, function(err, res) { if(!res.length) { founded = true; // How to do it? } }); } return str; } 

如何使用数据库查询callback设置variables值? 我怎么能做到这一点?

提前致谢。

我使用node.js已经有一段时间了,但是我想我可以帮忙。

首先,在节点中,你只有一个线程,应该使用callback。 你的代码会发生什么, base.getID查询将被排队等待执行,但while循环将继续作为一个忙碌的循环毫无意义地运行。

你应该能够通过callback来解决你的问题,如下所示:

 function generate(count, k) { var _sym = 'abcdefghijklmnopqrstuvwxyz1234567890', var str = ''; for(var i = 0; i < count; i++) { str += _sym[parseInt(Math.random() * (_sym.length))]; } base.getID(str, function(err, res) { if(!res.length) { k(str) // use the continuation } else generate(count, k) // otherwise, recurse on generate }); } 

并使用它

 generate(10, function(uniqueId){ // have a uniqueId }) 

我在2年左右没有编写任何node / js,并且没有testing过这个,但是基本的想法应该保留 – 不要使用繁忙的循环,并且使用callback。 你可能想看看节点的asynchronous包。

使用https://github.com/broofa/node-uuid

 npm install uuid var uuid = require('uuid'); 

然后创build一些ID …

 // Generate a v1 (time-based) id uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' // Generate a v4 (random) id uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

** 更新3.1.0
上面的用法是不推荐的 ,所以使用这个包是这样的:

 const uuidv1 = require('uuid/v1'); uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' const uuidv4 = require('uuid/v4'); uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

在Node中创build随机32位string的最快方法是使用本机crypto模块:

 const crypto = require("crypto"); const id = crypto.randomBytes(16).toString("hex"); console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e 

另一种方法是使用npm的shortid包。

这是非常容易使用:

 var shortid = require('shortid'); console.log(shortid.generate()); // eg S1cudXAF 

并具有一些引人注目的特点:

ShortId创build了非常短的非序列url友好唯一ID。 适用于url缩写,MongoDB和Redis ID以及其他ID用户可能会看到的内容。

  • 默认情况下为7-14个友好的字符:AZ,az,0-9,_-
  • 非顺序,所以他们不可预测。
  • 可以生成任何数量的ID不重复,甚至每天几百万。
  • 应用程序可以重新启动任何次数,而不必重复一个id。

node-uuid已弃用,请使用uuid

 npm install uuid --save // Generate a v1 UUID (time-based) const uuidV1 = require('uuid/v1'); uuidV1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' // Generate a v4 UUID (random) const uuidV4 = require('uuid/v4'); uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

Npm链接

更简单,没有额外的模块

 Math.random().toString(26).slice(2) 

如果有人需要密码强的UUID,那么也有解决scheme。

https://www.npmjs.com/package/generate-safe-id

 npm install generate-safe-id 

为什么不UUID?

随机UUID(UUIDv4) 没有足够的熵来普遍唯一(具有讽刺意味,呃?)。 随机UUID只有122比特的熵,这表明在仅有2 ^ 61个 ID之后会出现重复。 此外,一些UUIDv4实现不使用密码强的随机数生成器。

该库使用Node.jsencryptionRNG生成240位 ID,表示在生成2 ^ 120个 ID之后将发生第一个重复。 基于目前人类的能源生产,在可预见的未来,这个门槛是不可能跨越的。

 var generateSafeId = require('generate-safe-id'); var id = generateSafeId(); // id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"