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;
}
Как установить значение переменной с обратным вызовом запроса базы данных? Как я могу это сделать?
javascript
node.js
express
сова
источник
источник
var hexstring = crypto.randomBytes(16).toString("hex");
сопровождаемыйvar guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
помощью stackoverflow.com/a/56106999/4701635Ответы:
Прошло некоторое время с тех пор, как я использовал node.js, но я думаю, что смогу помочь.
Во-первых, в узле у вас есть только один поток, и вы должны использовать обратные вызовы. Что произойдет с вашим кодом, так это то, что
base.getID
запрос будет поставлен в очередь для выполнения, ноwhile
цикл будет непрерывно бессмысленно выполняться как занятый цикл.Вы должны быть в состоянии решить вашу проблему с обратным вызовом следующим образом:
И использовать его как таковой
Я не кодировал ни одного узла / js в течение 2 лет и не проверял это, но основная идея должна сохраниться - не использовать занятый цикл и использовать обратные вызовы. Возможно, вы захотите взглянуть на асинхронный пакет узла.
источник
Установите пакет NPM uuid (источники: https://github.com/kelektiv/node-uuid ):
и используйте его в своем коде:
Затем создайте несколько идентификаторов ...
** ОБНОВЛЕНИЕ 3.1.0
Вышеуказанное использование устарело , поэтому используйте этот пакет следующим образом:
** ОБНОВЛЕНИЕ 7.x
И теперь вышеупомянутое использование рекомендуется , так что используйте этот пакет следующим образом:
источник
Самый быстрый способ создать произвольную 32-символьную строку в Node - использовать встроенный
crypto
модуль:источник
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
теперь встроен в сам узел. Вы получаете это предупреждение, если устанавливаете npm:crypto@1.0.1: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in
Другой подход заключается в использовании пакета shorttid из npm.
Он очень прост в использовании:
и имеет некоторые неотразимые особенности:
источник
node-uuid
устарела, поэтому, пожалуйста, используйтеuuid
Ссылка Npm
источник
Простой, основанный на времени, без зависимостей:
Вывод:
jzlatihl
плюс случайное число (спасибо ответу Ярослава Гапонова)
Вывод
jzlavejjperpituute
источник
Более простые и без дополнительных модулей
источник
function getId(mask) { return mask.replace(/[x]/gi, () => { return Math.random().toString(26)[5]; }) } console.log(getId('xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'));
random_numbers = [] for (i = 0; i < 1000000; i++) { random_numbers.push(Math.random()) } 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) }
Если кому-то нужен криптографически сильный UUID, для этого также есть решение.
https://www.npmjs.com/package/generate-safe-id
источник
generate-safe-id
что он был заброшен И уязвимости безопасности не исправлены (по состоянию на август 2018 года)Я использую следующее, и это работает нормально плюс без каких-либо сторонних зависимостей.
источник
Решения здесь старые и сейчас устарели: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Использовать это:
источник
использовал https://www.npmjs.com/package/uniqid в npm
Он всегда будет создавать уникальные идентификаторы на основе текущего времени, процесса и имени машины.
Характеристики:-
источник
установить uuid
uuid обновлен и старый импорт
не работает, и теперь мы должны использовать этот импорт
и для его использования используйте как функцию =>
источник
Продолжая ответ Ярослава Гапонова, самая простая реализация - это просто использование
Math.random()
.Вероятность того, что дроби будут одинаковыми в реальном пространстве [0, 1], теоретически равна 0 и приблизительно равна 0 для длины по умолчанию 16 десятичных знаков в файле node.js. И эта реализация должна также уменьшить арифметические переполнения, поскольку никакие операции не выполняются. Кроме того, он эффективнее по сравнению со строкой, так как десятичные дроби занимают меньше памяти, чем строки.
Я называю это «Chong-Fractional-Unique-ID» . Я до сих пор не написал статью о его свойствах, которая, надеюсь, скоро появится.
Написал код для генерации 1 000 000
Math.random()
чисел и не смог найти дубликатов (по крайней мере для десятичных точек по умолчанию 16). Смотрите код ниже (пожалуйста, оставьте отзыв, если есть):источник
random_numbers.push(Math.random().toFixed(13))
прежнему дают одинаковую длину