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

owl*_*owl 135 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*243 263

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

npm install uuid
Run Code Online (Sandbox Code Playgroud)

然后创建一些ID ...

var uuid = require('uuid');
Run Code Online (Sandbox Code Playgroud)

**更新3.1.0
以上用法已弃用,因此请使用此包:

// 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'
Run Code Online (Sandbox Code Playgroud)

  • 如果它在db查询中有什么区别?您有一个唯一的ID,现在可以在用于与数据库通信的任何接口中使用它. (44认同)
  • 不推荐使用@ ishandutta2007 node-uuid:"DEPRECATED:改为使用uuid包." (5认同)
  • @Downgoat,`crypto.randomBytes(16).toString("hex")` 与 `uuidv4()` 相比,什么是更好的选择?第一个内置于 Node.js 中。 (4认同)
  • Nodejs `v15.6.0` 现在支持 `crypto.randomUUID();` (2认同)
  • @FilipSeman根据文档,它已经“添加到:v14.17.0”(https://nodejs.org/docs/latest-v14.x/api/crypto.html#crypto_crypto_randomuuid_options),这是星期二,拯救了我的一天。 (2认同)

Pon*_*ono 194

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

const crypto = require("crypto");

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

console.log(id); // => f9b327e70bbcf42494ccb28b2d98e00e
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,因为不需要外部依赖.另外我发现base64版本也很有用.`crypto.randomBytes(3*4).t​​oString('base64')// =>'9uzHqCOWI9Kq2Jdw'` (37认同)
  • `crypto` 现在内置于 node 本身。如果你 npm install 它,你会收到这个警告: `crypto@1.0.1: 这个包不再受支持。它现在是一个内置的 Node 模块。如果你依赖加密,你应该切换到内置的 (5认同)
  • 一点点帮助以 UUID 格式获取它 `[8,4,4,4,12].map(n =&gt; crypto.randomBytes(n/2).toString("hex")).join("- ”)` (5认同)
  • 它是随机的还是唯一的?请详细说明随机功能. (4认同)
  • @owl 我觉得这确实是最好的答案,您会考虑将其更新为所选答案吗? (3认同)
  • “生成加密强的伪随机数据。” [API](https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback) (2认同)
  • 只是想澄清一下,Greg 的解决方案在技术上并没有创建实际的 UUID,因为它们具有某些非随机的字节。然而,它仍然应该适用于所有意图和目的。 (2认同)

str*_*str 27

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

这是非常容易使用:

var shortid = require('shortid');
console.log(shortid.generate()); // e.g. S1cudXAF
Run Code Online (Sandbox Code Playgroud)

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

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

  • 默认情况下,7-14个网址友好字符:AZ,az,0-9,_-
  • 非顺序,因此它们是不可预测的.
  • 可以生成任意数量的ID而无需重复,甚至每天数百万.
  • 应用程序可以重新启动任意次,而无需重复ID.

  • “shortid 已被弃用,因为该架构不安全。我们建议使用 Nano ID,它的优点是比 Shortid 快得多” https://github.com/ai/nanoid (2认同)

Dhe*_*Rao 19

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

console.log(randomUUID());

// '89rct5ac2-8493-49b0-95d8-de843d90e6ca'
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以探索 https://nodejs.org/api/crypto.html#crypto_crypto_randomuuid_options

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


Pra*_*ena 17

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' 
Run Code Online (Sandbox Code Playgroud)

Npm链接


raf*_*lio 14

我使用node.js已经有一段时间了,但我想我可以提供帮助.

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

您应该能够通过回调解决您的问题,如下所示:

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
    });
}
Run Code Online (Sandbox Code Playgroud)

并使用它

generate(10, function(uniqueId){
  // have a uniqueId
})
Run Code Online (Sandbox Code Playgroud)

我没有在大约2年内编码任何节点/ js并且没有测试过这个,但基本的想法应该保持 - 不要使用繁忙的循环,并使用回调.您可能希望查看节点异步包.

  • 当需要真正的随机ID时,Math.random是一个糟糕的选择,特别是当它需要不可预测/加密安全时. (4认同)

Roh*_*aki 10

安装uuid

npm install --save uuid
Run Code Online (Sandbox Code Playgroud)

uuid 已更新,旧的导入

const uuid= require('uuid/v4');
Run Code Online (Sandbox Code Playgroud)

不工作,我们现在应该使用这个导入

const {v4:uuid} = require('uuid');
Run Code Online (Sandbox Code Playgroud)

并使用它作为这样的功能

const  createdPlace = {
    id: uuid(),
    title,
    description,
    location:coordinates,
    address,
    creator
  };
Run Code Online (Sandbox Code Playgroud)


Art*_*sun 9

我的5美分:

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('-');
};
Run Code Online (Sandbox Code Playgroud)

不幸的是, Pono的字符串缺少连字符,因此它不符合uuid 标准,我相信这就是大多数人来这里的原因。

> generateUuid();
'143c8862-c212-ccf1-e74e-7c9afa78d871'
> generateUuid();
'4d02d4d6-4c0d-ea6b-849a-208b60bfb62e'
Run Code Online (Sandbox Code Playgroud)


Yar*_*nov 6

更简单,没有附加模块

Math.random().toString(26).slice(2)
Run Code Online (Sandbox Code Playgroud)

  • 当需要真正的随机ID时,Math.random是一个糟糕的选择,特别是当它需要不可预测/加密安全时. (6认同)
  • 我认为这取决于长度。所以你可以像这样内联`function getId(mask) { return mask.replace(/[x]/gi, () =&gt; { return Math.random().toString(26)[5]; }) } console.log(getId('xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'));` (3认同)
  • 这不会生成真正普遍唯一的 ID。 (2认同)

saf*_*zik 6

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

(new Date()).getTime().toString(36)
Run Code Online (Sandbox Code Playgroud)

输出: jzlatihl


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

(new Date()).getTime().toString(36) + Math.random().toString(36).slice(2)
Run Code Online (Sandbox Code Playgroud)

输出量 jzlavejjperpituute

  • 请注意:我强烈反对任何重要应用程序使用此解决方案:此类客户端的“时间相关”唯一 id 绝对是 **NO-GO** 。尽管添加随机数(如本文末尾提到的)会有所帮助。 (6认同)

ch3*_*v3k 5

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

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

npm install generate-safe-id
Run Code Online (Sandbox Code Playgroud)

为什么不是 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"
Run Code Online (Sandbox Code Playgroud)

  • 由于“generate-safe-id”被放弃且安全漏洞未修复(截至 2018 年 8 月),此答案可能不再适用于用户 (11认同)

use*_*877 5

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