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

时间:2014-04-27 18:04:42

标签: javascript node.js express

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;
}

如何使用数据库查询回调设置变量值?我怎么能这样做?

18 个答案:

答案 0 :(得分:229)

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

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

然后创建一些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
以上用法为deprecated,因此请使用此包:

const uuidv1 = require('uuid/v1');
uuidv1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' 

const uuidv4 = require('uuid/v4');
uuidv4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

答案 1 :(得分:163)

在Node中创建随机32字符串的最快方法是使用本机crypto模块:

const crypto = require("crypto");

const id = crypto.randomBytes(16).toString("hex");

console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e

答案 2 :(得分:23)

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

它非常易于使用:

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

并具有一些引人注目的功能:

  

ShortId创建了非常短的非连续url友好的独特   IDS。适用于网址缩短,MongoDB和Redis ID以及其他任何内容   id用户可能会看到。

     
      
  • 默认情况下,7-14个网址友好字符:A-Z,a-z,0-9,_-
  •   
  • 非顺序,因此无法预测。
  •   
  • 可以生成任意数量的ID而无需重复,甚至每天数百万。
  •   
  • 可以多次重启应用,而无需重复ID。
  •   

答案 3 :(得分:15)

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 link

答案 4 :(得分:8)

简单,基于时间,没有依赖性:

(new Date()).getTime().toString(36)

输出:jzlatihl


加上随机数(感谢@Yaroslav Gaponov的回答)

(new Date()).getTime().toString(36) + Math.random().toString(36).slice(2)

输出jzlavejjperpituute

答案 5 :(得分:8)

安装uuid

npm install --save uuid

uuid已更新,旧导入

const uuid= require('uuid/v4');

不起作用,我们现在应该使用此导入

const {v4:uuid} = require('uuid');

并使用它作为这样的功能

const  createdPlace = {
    id: uuid(),
    title,
    description,
    location:coordinates,
    address,
    creator
  };

答案 6 :(得分:6)

更简单,没有附加模块

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

答案 7 :(得分:5)

const { randomUUID } = require('crypto'); // Added in: node v15.6.0

console.log(randomUUID());

//'89rct5ac2-8493-49b0-95d8-de843d90e6ca'

更多你可以探索 https://nodejs.org/api/crypto.html#crypto_crypto_randomuuid_options

注意:- crypto.randomUUID 比 uuid 快三倍。并且不需要添加额外的依赖。

答案 8 :(得分:4)

如果您使用 node v15.6.0+,我们可以使用 crypto.randomUUID([options])。完整文档 here

答案 9 :(得分:3)

我的 5 美分:

class ProductId
{
    public Guid Value { get; }
    
    public ProductId(Guid value)
    {
        // validation
        Value = value
    }
}

Pono 的字符串可惜没有连字符,所以它不符合 uuid standard,我相信这是大多数人来到这里的目的。

const crypto = require('crypto');

const generateUuid = () => {
  return [4, 2, 2, 2, 6] // or 8-4-4-4-12 in hex
    .map(group => crypto.randomBytes(group).toString('hex'))
    .join('-');
};

答案 10 :(得分:1)

如果某人需要加密强UUID,那么也有解决方案。

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

npm install generate-safe-id
  

为什么不是UUID?

     

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

     

此库使用Node.js加密RNG生成 240位 ID,   建议在生成 2 ^ 120 ID后发生第一个重复。   基于当前人类的能量产生,这一点   在可预见的未来,门槛将无法跨越。

var generateSafeId = require('generate-safe-id');

var id = generateSafeId();
// id == "zVPkWyvgRW-7pSk0iRzEhdnPcnWfMRi-ZcaPxrHA"

答案 11 :(得分:1)

我正在使用以下内容,并且可以正常运行,而且没有任何第三方依赖性。

const {
  randomBytes
} = require('crypto');

const uid = Math.random().toString(36).slice(2) + randomBytes(8).toString('hex') + new Date().getTime();

答案 12 :(得分:1)

这里的解决方案很旧,现在已过时:https://github.com/uuidjs/uuid#deep-requires-now-deprecated

使用此:

npm安装uuid

//add these lines to your code
const { v4: uuidv4 } = require('uuid');
var your_uuid = uuidv4();
console.log(your_uuid);

答案 13 :(得分:1)

YaroslavGaponov的答案开始,最简单的实现就是使用Math.random()

Math.random()

在实空间[0,1]中分数相同的机会理论上为0,对于node.js中默认的16位小数长度,其几率接近于0。此实现还应减少算术溢出,因为不执行任何操作。另外,与字符串相比,它的内存效率更高,因为小数比字符串占用的内存少。

我将此称为“崇分数部分唯一ID”

编写代码以生成1,000,000 Math.random()个数字,并且找不到任何重复项(至少对于默认的小数点为16)。请参见下面的代码(如果有请提供反馈):

random_numbers = [] 
for (i = 0; i < 1000000; i++) { 
   random_numbers.push(Math.random()) 
   //random_numbers.push(Math.random().toFixed(13)) //depends decimals default 16 
} 

if (i === 1000000) { 
   console.log("Before checking duplicate") 
   console.log(random_numbers.length) 
   console.log("After checking duplicate") 
   random_set = new Set(random_numbers) 
   console.log([...random_set].length) // length is still the same
} 

答案 14 :(得分:0)

我想用这个

class GUID {
    Generate() {
    const hex = "0123456789ABCDEF";
    const model = "xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx";
    var str = "";
    for (var i = 0; i < model.length; i++) {
      var rnd = Math.floor(Math.random() * hex.length);
      str += (model[i] == "-" || model[i] == "4") ?  model[i] : hex[rnd];
    }
    return str.toLowerCase();
  }
}
 
console.log(new GUID().Generate());
console.log(new GUID().Generate());
console.log(new GUID().Generate());
console.log(new GUID().Generate());
console.log(new GUID().Generate());

答案 15 :(得分:0)

nanoid完全可以满足您的需求。

用法示例:

const { nanoid } = require("nanoid")

console.log(nanoid())
//=> "n340M4XJjATNzrEl5Qvsh"

答案 16 :(得分:0)

在npm中使用https://www.npmjs.com/package/uniqid

npm i uniqid

它将始终根据当前时间,进程和机器名称创建唯一的ID。

  • 当前,ID在单个过程中始终是唯一的。
  • 使用进程ID,即使同时调用,ID也是唯一的 时间来自多个过程。
  • 即使使用相同的MAC地址,ID也是唯一的 时间来自多个机器和进程。

功能:-

  • 很快
  • 即使在多个进程和机器上生成唯一的ID,即使 同时打电话。
  • 缩短8和12字节版本,减少唯一性。

答案 17 :(得分:-2)

要生成 UUID,符合 RFC4122 版本 4。

import crypto from 'crypto';

function uuid(): string {
    const uuid: string = (
        // @ts-ignore
        [1e7] + // 10000000
        -1e3 +  // -1000
        -4e3 +  // -4000
        -8e3 +  // -8000
        -1e11   // -100000000000
    )
    .replace(/[018]/g, (c: number) => (
        // Replace zeroes, ones, and eights with random number
        c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))
    )
    .toString(16));
    return uuid;
}

uuid(); // 4527ee89-317c-4b95-add3-9d6eb91b97e4

更新

randomUUID 中添加了原生加密函数 v15.6.0

import crypto from 'crypto';

crypto.randomUUID(); // b544a5c2-41f5-4685-85a5-fffe03a8e8e6