如何用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"