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;
}
如何使用数据库查询回调设置变量值?我怎么能这样做?
答案 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'
答案 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。
功能:-
答案 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