Подтвердить что ты не робот

Как создать уникальный идентификатор с помощью node.js

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

Как установить значение переменной с обратным вызовом запроса базы данных? Как я могу это сделать?

4b9b3361

Ответ 1

Прошло некоторое время с тех пор, как я использовал node.js, но я думаю, что мог бы помочь.

Во-первых, в node у вас есть только один поток и предполагается использовать обратные вызовы. Что произойдет с вашим кодом, так это то, что запрос 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
    });
}

И используйте его как таковой

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

Я не кодировал никаких node/js примерно через 2 года и не тестировал это, но основная идея должна быть выполнена - не используйте цикл занятости и не используйте обратные вызовы. Возможно, вам стоит взглянуть на пакет асинхронизации node.

Ответ 2

Установите пакет NPM uuid (источники: https://github.com/kelektiv/node-uuid):

npm install uuid

и используйте его в своем коде:

var uuid = require('uuid');

Затем создайте несколько идентификаторов...

// 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' 

Ответ 3

Самый быстрый способ создать случайную 32- char строку в Node можно с помощью встроенного модуля crypto:

const crypto = require("crypto");

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

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

Ответ 4

Другой подход заключается в использовании пакета shortid от npm.

Это очень легко использовать:

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

и имеет некоторые неотразимые возможности:

ShortId создает удивительно короткий несегментный уникальный URL-адрес Идентификаторы. Идеально подходит для укорочения url, MongoDB и Redis ids и любых других пользователи id могут видеть.

  • По умолчанию 7-14 URL-символов: A-Z, a-z, 0-9, _-
  • Непоследовательно, поэтому они не предсказуемы.
  • Может генерировать любое количество идентификаторов без дубликатов, даже миллионов в день.
  • Приложения могут быть перезапущены любое количество раз без повторения идентификатора.

Ответ 5

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

Ответ 6

Более простые и без добавления модулей

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

Ответ 7

Если кому-то нужен криптографически-сильный UUID, есть решение для этого.

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

npm install generate-safe-id

Почему не UUID?

Случайные UUID (UUIDv4) не имеют достаточной энтропии, чтобы быть универсальной уникальный (иронический, а?). Случайные UUID имеют только 122 бит энтропии, что предполагает, что дубликат будет происходить только после идентификаторов 2 ^ 61. Кроме того, некоторые реализации UUIDv4 не используют криптографически сильный генератор случайных чисел.

Эта библиотека генерирует идентификаторы 240 бит, используя криптовальный RNG Node.js, предполагая, что первый дубликат произойдет после генерации идентификаторов 2 ^ 120. Основываясь на нынешнем производстве энергии человеческой расы, это порог будет невозможно пересечь в обозримом будущем.

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

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

Ответ 8

Простой, основанный на времени, без зависимостей:

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

Вывод: jzlatihl


плюс случайное число (благодаря ответу Ярослава Гапонова)

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

Вывод jzlavejjperpituute