Saya ingin string 5 karakter yang terdiri dari karakter yang dipilih secara acak dari set [a-zA-Z0-9]
.
Apa cara terbaik untuk melakukan ini dengan JavaScript?
javascript
random
Tom Lehman
sumber
sumber
true-random
hasil! Hanya merekapseudo-random
. Saat menggunakan string acak untuk perlindungan atau keamanan, jangan gunakan salah satu dari itu !!! Cobalah salah satu dari api ini: random.orgMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Jawaban:
Saya pikir ini akan bekerja untuk Anda:
sumber
+=
string seperti ini menyebabkannya memiliki perilaku O (n ^ 2). Jika Anda ingin membuat string yang lebih panjang, Anda harus membuat array karakter individual dan bergabung bersama di akhir.+=
seringkali lebih cepat karena beberapa alasan, bahkan digunakan di dalam loop - jsperf.com/join-vs-concatenationcrypto
saja.Catatan: Algoritma di atas memiliki kelemahan berikut:
Math.random()
dapat menghasilkan output yang dapat diprediksi ("tampak acak" tetapi tidak benar-benar acak) tergantung pada implementasinya. String yang dihasilkan tidak cocok ketika Anda perlu menjamin keunikan atau ketidakpastian.sumber
Math.random().toString(36).substr(2, 5)
, karena.substring(7)
menyebabkannya lebih dari 5 karakter. Poin penuh, masih!toString
Metode tipe angka dalam javascript mengambil parameter opsional untuk mengubah nomor menjadi basis yang diberikan. Jika Anda melewati dua, misalnya, Anda akan melihat nomor Anda terwakili dalam biner. Mirip dengan hex (basis 16), basis 36 menggunakan huruf untuk mewakili angka di luar 9. Dengan mengubah angka acak ke basis 36, Anda akan berakhir dengan sekelompok huruf dan angka yang tampaknya acak.(Math.random() + 1).toString(36).substring(7);
Math.random buruk untuk hal semacam ini
Pilihan 1
Jika Anda dapat melakukan ini di sisi server , cukup gunakan modul kripto -
String yang dihasilkan akan dua kali lebih lama dari byte acak yang Anda hasilkan; setiap byte yang dikodekan ke hex adalah 2 karakter. 20 byte akan menjadi 40 karakter hex.
pilihan 2
Jika Anda harus melakukan ini di sisi klien , mungkin coba modul uuid -
Opsi 3
Jika Anda harus melakukan ini di sisi klien dan Anda tidak harus mendukung browser lama, Anda dapat melakukannya tanpa ketergantungan -
Untuk informasi lebih lanjut tentang
crypto.getRandomValues
-Ini contoh konsol kecil -
Untuk dukungan IE11, Anda dapat menggunakan -
Untuk jangkauan browser, lihat https://caniuse.com/#feat=getrandomvalues
sumber
.map()
di Opsi 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Terima kasih telah memperkenalkan saya pada fitur-fitur ini :-)require
modul hanya dapat digunakan di sisi server?Singkat, mudah, dan andal
Mengembalikan tepat 5 karakter acak, yang bertentangan dengan beberapa jawaban berperingkat teratas yang ditemukan di sini.
sumber
Math.random().toString(36)
mengembalikan nomor dengan kurang dari 5 karakter?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Berikut perbaikan pada jawaban doubletap ini sangat baik . Dokumen asli memiliki dua kelemahan yang dibahas di sini:
Pertama, seperti yang disebutkan orang lain, ia memiliki kemungkinan kecil untuk menghasilkan string pendek atau bahkan string kosong (jika angka acaknya adalah 0), yang dapat merusak aplikasi Anda. Ini solusinya:
Kedua, baik yang asli dan solusi di atas membatasi ukuran string N hingga 16 karakter. Berikut ini akan mengembalikan string ukuran N untuk setiap N (tetapi perhatikan bahwa menggunakan N> 16 tidak akan meningkatkan keacakan atau mengurangi kemungkinan tabrakan):
Penjelasan:
Pikiran lebih lanjut:
Memperbarui:
Berikut adalah beberapa gaya-gaya lain yang saya buat. Mereka berbeda dari solusi di atas dalam hal:
Jadi, katakan alfabet pilihan Anda adalah
Maka keduanya setara satu sama lain, sehingga Anda dapat memilih mana yang lebih intuitif bagi Anda:
dan
Edit:
Saya sepertinya qubyte dan Martijn de Milliano datang dengan solusi yang mirip dengan yang terakhir (pujian!), Yang entah bagaimana saya lewatkan. Karena mereka tidak melihat sepintas sekilas, saya akan meninggalkannya di sini kalau-kalau seseorang benar-benar menginginkan satu-liner :-)
Juga, ganti 'Array baru' dengan 'Array' di semua solusi untuk mengurangi beberapa byte lagi.
sumber
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
memberikan hasil yang diharapkan yang lebih seperti.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
Solusi paling ringkas, karena
slice
lebih pendek darisubstring
. Mengurangkan dari ujung string memungkinkan untuk menghindari simbol floating point yang dihasilkan olehrandom
fungsi:atau bahkan
Pembaruan: Menambahkan satu lagi pendekatan menggunakan
btoa
metode:sumber
Math.random().toString(36).slice(-5);
- Bagaimana jikaMath.random()
kembali0.0
?"0"
;)Math.random()
mengembalikan0.5
hasilnya"0.i"
. Tidak yakin apakah ada kasus tepi lainnya. Hanya ingin menunjukkan bahwa ini bukan jawaban yang benar untuk pertanyaan (5 karakter dari [a-zA-Z0-9]).(+new Date + Math.random())
untuk mencegah kasus ini. Bagaimanapun, terima kasih atas catatannya.Sesuatu seperti ini seharusnya bekerja
Hubungi dengan charset default [a-zA-Z0-9] atau kirim sendiri:
sumber
len
langsung dalam satuwhile
lingkaranVersi yang lebih baru dengan operator penyebaran es6 :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
adalah nomor arbitrer, Anda dapat memilih token yang Anda inginkan36
adalah nomor radix maksimum yang dapat Anda lewati ke numeric.toString () , yang artinya semua angka dan huruf kecil a2
digunakan untuk memilih indeks ke-3 dari string acak yang terlihat seperti ini:,"0.mfbiohx64i"
kita bisa mengambil indeks apa pun setelah0.
sumber
sumber
while(s.length< L) s+= randomchar();
while(L--)
akan melakukannya'A'.charCodeAt(0)
daripada angka ajaib55
(dan juga untuk61
). Terutama karena, pada platform saya, angka ajaib yang kembali adalah65
. Kode itu juga akan mendokumentasikan diri dengan lebih baik.Pembuat String Acak (Alpha-Numeric | Alpha | Numeric)
Sementara di atas menggunakan pemeriksaan tambahan untuk A / N, A, N yang diinginkan output , mari kita pilah sampai ke esensi (hanya Alpha-Numeric) untuk pemahaman yang lebih baik:
var str = "";
untuk menggabungkan karakter acakrand
nomor indeks dari 0 hingga 61 (0..9 + A..Z + a..z = 62)rand
(karena 0..61) menambahkannya dengan beberapa nomor (lihat contoh di bawah) untuk mendapatkan kembali hak.CharCode
nomor yang dan Karakter terkait.str
aString.fromCharCode( incremented rand )
Mari kita gambarkan rentang tabel Karakter ASCII :
Math.floor( Math.random * 62 )
memberikan rentang dari0..61
(apa yang kita butuhkan).Mari kita perbaiki acak untuk mendapatkan rentang kode karakter yang benar :
The bersyarat operasi logika dari tabel di atas:
Dari penjelasan di atas, inilah cuplikan alpha-numeric yang dihasilkan :
Atau jika Anda akan:
sumber
Cara paling sederhana adalah:
Ini menghasilkan string acak 5 karakter berdasarkan waktu saat ini. Contoh output adalah
4mtxj
atau4mv90
atau4mwp1
Masalah dengan ini adalah bahwa jika Anda memanggilnya dua kali pada detik yang sama, itu akan menghasilkan string yang sama.
Cara yang lebih aman adalah:
Ini akan menghasilkan string acak 4 atau 5 karakter, selalu berbeda. Contoh outputnya seperti
30jzm
atau1r591
atau4su1a
Dalam kedua cara bagian pertama menghasilkan angka acak. Bagian
.toString(36)
melemparkan nomor ke representasi base36 (alfabet).sumber
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
untuk menutupinya.(Math.random()*1e20).toString(36)
.Berikut adalah beberapa kalimat yang mudah. Ubah
new Array(5)
untuk mengatur panjangnya.Termasuk
0-9a-z
Termasuk
0-9a-zA-Z
sumber
Saya tahu semua orang sudah melakukannya dengan benar, tetapi saya merasa ingin mencoba yang ini dengan cara yang paling ringan (ringan pada kode, bukan CPU):
Dibutuhkan sedikit waktu untuk membungkus kepala Anda, tapi saya pikir itu benar-benar menunjukkan betapa mengagumkannya sintaks javascript.
sumber
current = current ? current : '';
ketika Anda bisa menuliscurrent = current || ''
;current || (current = '');
Jika Anda menggunakan Lodash atau Underscore , maka sangat sederhana:
sumber
_.sampleSize('asdfgh',5).join('')
Untuk memenuhi persyaratan [a-zA-Z0-9] dan panjang = 5 gunakan
Huruf kecil, huruf besar, dan angka akan muncul.
sumber
Jika ada yang tertarik dengan satu-liner (meskipun tidak diformat untuk kenyamanan Anda) yang mengalokasikan memori sekaligus (tetapi perhatikan bahwa untuk string kecil itu benar-benar tidak masalah) di sini adalah bagaimana melakukannya:
Anda dapat mengganti
5
dengan panjang string yang Anda inginkan. Terima kasih kepada @AriyaHidayat dalam posting ini untuk solusi untukmap
fungsi yang tidak bekerja pada array yang jarang dibuat olehArray(5)
.sumber
Inilah metode yang saya buat.
Ini akan membuat string yang berisi karakter huruf besar dan kecil.
Selain itu saya telah menyertakan fungsi yang akan membuat string alfanumerik juga.
Contoh kerja:
http://jsfiddle.net/greatbigmassive/vhsxs/ (hanya alfa)
http://jsfiddle.net/greatbigmassive/PJwg8/ (alfanumerik)
Tingkatkan Juli 2015
Ini melakukan hal yang sama tetapi lebih masuk akal dan mencakup semua surat.
sumber
Dengan asumsi Anda menggunakan underscorejs dimungkinkan untuk menghasilkan string acak secara elegan hanya dalam dua baris:
sumber
sumber
Algoritma yang cepat dan ditingkatkan. Tidak menjamin seragam (lihat komentar).
sumber
crypto.getRandomValues
mengembalikan salah satu dari 256 nilai unik. Karena 256 tidak dibagi dengan 62, Anda akhirnya memiliki kemungkinan sedikit lebih tinggi untuk mendapatkan karakter AH. Saya pikir solusi terbaik adalah melakukan apa yang YouTube lakukan, dan hanya menambahkan 2 karakter tambahan (mungkin-
dan_
) ke rangkaian karakter. Ngomong-ngomong, kerja bagus - jawaban ini membutuhkan lebih banyak cinta :)Masalah dengan respons terhadap pertanyaan "Saya perlu string acak" (dalam bahasa apa pun) praktis setiap solusi menggunakan spesifikasi primer cacat panjang string . Pertanyaan-pertanyaan itu sendiri jarang mengungkapkan mengapa string acak diperlukan, tetapi saya akan menantang Anda jarang membutuhkan string acak panjang, katakan 8. Apa yang Anda selalu butuhkan adalah sejumlah string unik , misalnya, untuk digunakan sebagai pengidentifikasi untuk beberapa tujuan.
Ada dua cara utama untuk mendapatkan string unik yang unik : secara deterministik (yang tidak acak) dan menyimpan / membandingkan (yang memberatkan). Apa yang kita lakukan? Kami menyerah hantu. Kami pergi dengan keunikan probabilistik sebagai gantinya. Yaitu, kami menerima bahwa ada beberapa (betapapun kecil) risiko bahwa string kami tidak akan menjadi unik. Di sinilah memahami probabilitas tabrakan dan entropi sangat membantu.
Jadi saya akan ulangi kebutuhan yang tidak berubah sebagai membutuhkan sejumlah string dengan risiko pengulangan yang kecil. Sebagai contoh nyata, katakanlah Anda ingin menghasilkan potensi 5 juta ID. Anda tidak ingin menyimpan dan membandingkan setiap string baru, dan Anda ingin mereka menjadi acak, sehingga Anda menerima risiko berulang. Sebagai contoh, katakanlah risiko kurang dari 1 dalam satu triliun peluang berulang. Jadi berapa panjang tali yang Anda butuhkan? Nah, pertanyaan itu tidak ditentukan karena tergantung pada karakter yang digunakan. Tapi yang lebih penting, ini salah arah. Yang Anda butuhkan adalah spesifikasi entropi string, bukan panjangnya. Entropi dapat secara langsung terkait dengan probabilitas pengulangan dalam sejumlah string. Panjang string tidak bisa.
Dan di sinilah perpustakaan seperti EntropyString dapat membantu. Untuk menghasilkan ID acak yang memiliki peluang kurang dari 1 dalam satu triliun untuk diulang dalam 5 juta string menggunakan
entropy-string
:entropy-string
menggunakan set karakter dengan 32 karakter secara default. Ada set karakter yang telah ditentukan sebelumnya, dan Anda dapat menentukan karakter Anda sendiri juga. Misalnya, membuat ID dengan entropi yang sama seperti di atas tetapi menggunakan karakter hex:Perhatikan perbedaan panjang string karena perbedaan jumlah karakter dalam set karakter yang digunakan. Risiko pengulangan dalam jumlah string potensial yang ditentukan adalah sama. Panjang string tidak. Dan yang paling penting, risiko pengulangan dan potensi jumlah string adalah eksplisit. Tidak perlu lagi menebak dengan panjang tali.
sumber
Ini sebersih yang akan didapat. Itu juga cepat, http://jsperf.com/ay-random-string .
sumber
strLength - 1
: - /--strLength
kestrLength--
memperbaikinya untuk saya.Anda dapat mengulang melalui array item dan menambahkannya secara berulang ke variabel string, misalnya jika Anda ingin urutan DNA acak:
sumber
Saya tidak menemukan solusi bersih untuk mendukung karakter huruf kecil dan besar.
Huruf kecil hanya mendukung:
Math.random().toString(36).substr(2, 5)
Membangun solusi untuk mendukung huruf kecil dan besar:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Ubah
5
insubstr(2, 5)
untuk menyesuaikan dengan panjang yang Anda butuhkan.sumber
Satu liner:
sumber
Array(15)
ke nilai yang lebih kecil. Misalnya:Array(4)
.Ini pasti berhasil
sumber
Bagaimana dengan sesuatu seperti ini:
Date.now().toString(36)
Tidak terlalu acak, tetapi pendek dan cukup unik setiap kali Anda menyebutnya.sumber
Date.now()
hanya memiliki resolusi milidetik. Ketika dijalankan dalam satu loop sederhana, misalnya, Anda akan mendapatkan banyak duplikat.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.Karakter alfanumerik yang tidak peka huruf besar-kecil:
Manfaat dari fungsi ini adalah Anda bisa mendapatkan string acak panjang yang berbeda dan memastikan panjang string.
Case Sensitive All Chars:
Karakter Kustom
sumber
var possible
seperti dalam jawaban yang diterima, sehingga hasil dari fungsi lebih dapat dikonfigurasi.Hasilkan string 10 karakter. Panjangnya diatur oleh parameter (default 10).
sumber
Anda bisa menggunakan coderain . Itu perpustakaan untuk menghasilkan kode acak sesuai dengan pola yang diberikan. Gunakan
#
sebagai pengganti untuk karakter huruf besar dan kecil serta digit:Ada penampung lain seperti
A
untuk huruf besar atau9
angka.Yang mungkin berguna adalah panggilan itu
.next()
akan selalu memberi Anda hasil yang unik sehingga Anda tidak perlu khawatir tentang duplikat.Berikut adalah aplikasi demo yang menghasilkan daftar kode acak unik .
Pengungkapan penuh: Saya penulis coderain.
sumber