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;
}
Bagaimana cara menetapkan nilai variabel dengan panggilan balik permintaan basis data? Bagaimana saya bisa melakukannya?
javascript
node.js
express
burung hantu
sumber
sumber
var hexstring = crypto.randomBytes(16).toString("hex");
diikuti olehvar guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
dan secara manual stackoverflow.com/a/56106999/4701635Jawaban:
Sudah lama sejak saya menggunakan node.js, tapi saya pikir saya mungkin bisa membantu.
Pertama, dalam simpul, Anda hanya memiliki utas tunggal dan seharusnya menggunakan panggilan balik. Apa yang akan terjadi dengan kode Anda, adalah bahwa
base.getID
kueri akan mendapatkan antrian untuk dieksekusi, tetapiwhile
loop akan terus berjalan sebagai loop sibuk tanpa tujuan.Anda harus dapat menyelesaikan masalah Anda dengan panggilan balik sebagai berikut:
Dan gunakan seperti itu
Saya belum mengkodekan simpul / js dalam sekitar 2 tahun dan belum menguji ini, tetapi ide dasarnya harus terus - jangan menggunakan loop sibuk, dan gunakan callback. Anda mungkin ingin melihat pada paket async node.
sumber
Instal paket NPM uuid (sumber: https://github.com/kelektiv/node-uuid ):
dan gunakan dalam kode Anda:
Kemudian buat beberapa id ...
** PEMBARUAN 3.1.0
Penggunaan di atas sudah usang , jadi gunakan paket ini seperti ini:
** PEMBARUAN 7.x
Dan sekarang penggunaan di atas juga sudah usang , jadi gunakan paket ini seperti ini:
sumber
Cara tercepat yang mungkin untuk membuat string 32-char acak di Node adalah dengan menggunakan
crypto
modul asli :sumber
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
sekarang dibangun ke dalam node itu sendiri .. Anda mendapatkan peringatan ini jika Anda menginstalnya npm:[email protected]: 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
Pendekatan lain adalah dengan menggunakan shortid paket dari NPM.
Sangat mudah digunakan:
dan memiliki beberapa fitur menarik:
sumber
node-uuid
sudah usang jadi silakan gunakanuuid
Tautan npm
sumber
Sederhana, berbasis waktu, tanpa ketergantungan:
Keluaran:
jzlatihl
ditambah nomor acak (Terima kasih atas jawaban @Yaroslav Gaponov)
Keluaran
jzlavejjperpituute
sumber
Lebih mudah dan tanpa modul tambahan
sumber
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) }
Jika seseorang membutuhkan UUID yang kuat kriptografis, ada solusi untuk itu juga.
https://www.npmjs.com/package/generate-safe-id
sumber
generate-safe-id
ditinggalkan dan kerentanan keamanan tidak diperbaiki (per Agustus 2018)Saya menggunakan yang berikut ini dan berfungsi dengan baik plus tanpa ketergantungan pihak ketiga.
sumber
Solusi di sini sudah lama dan sekarang sudah tidak digunakan lagi: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Gunakan ini:
sumber
digunakan https://www.npmjs.com/package/uniqid dalam npm
Itu akan selalu membuat id unik berdasarkan waktu saat ini, proses dan nama mesin.
Fitur:-
sumber
untuk menginstal uuid
uuid diperbarui dan impor yang lama
tidak berfungsi dan kita sekarang harus menggunakan impor ini
dan untuk menggunakannya gunakan sebagai fungsi seperti ini =>
sumber
Memperluas dari jawaban YaroslavGaponov , implementasi paling sederhana hanya menggunakan
Math.random()
.Peluang pecahan sama dalam ruang nyata [0, 1] secara teoritis 0 dan mendekati 0 untuk panjang default 16 desimal di node.js. Dan implementasi ini juga harus mengurangi kelebihan aritmatika karena tidak ada operasi yang dilakukan. Selain itu, memori ini lebih efisien dibandingkan dengan string karena Desimal menempati lebih sedikit memori daripada string.
Saya menyebutnya "Chong-Fractional-Unique-ID" . Saya masih belum menulis makalah tentang sifat-sifatnya yang mudah-mudahan saya akan segera melakukannya.
Menulis kode untuk menghasilkan 1.000.000
Math.random()
angka dan tidak dapat menemukan duplikat (setidaknya untuk titik desimal default 16). Lihat kode di bawah ini (berikan umpan balik jika ada):sumber
random_numbers.push(Math.random().toFixed(13))
masih memberikan panjang yang sama