Как создать уникальный идентификатор с узлом.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;
}


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



спасибо заранее.

705   7  

7 ответов:

прошло некоторое время с тех пор, как я использовал узел.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
    });
}

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

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

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

использовать https://github.com/broofa/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' 

самый быстрый способ создать случайную 32-символьную строку в узле-это использовать native crypto модуль:

const crypto = require("crypto");

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

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

другой подход использует shortid от НПМ.

Он очень прост в использовании:

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

и имеет некоторые интересные функции:

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

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

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

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

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

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

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

npm install generate-safe-id

почему не UUIDs?

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

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

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

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

Comments

    Ничего не найдено.