Bagaimana untuk menjana rentetan alfanumerik rawak dalam JavaScript?
P粉775788723
P粉775788723 2023-10-12 23:03:12
0
2
720

Apakah cara terpendek (dalam sebab) untuk menjana rentetan abjad angka rawak (huruf besar, huruf kecil dan angka) untuk digunakan sebagai pengecam unik yang mungkin dalam JavaScript?

P粉775788723
P粉775788723

membalas semua(2)
P粉312195700

Saya baru mendapati ini adalah penyelesaian yang sangat bagus dan elegan:

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

Nota mengenai pelaksanaan ini:

  • Ini akan menghasilkan rentetan antara 0 dan 12 aksara panjang, biasanya 11 aksara memandangkan rentetan titik terapung mengalihkan sifar mengekor.
  • Ia tidak menjana huruf besar, hanya huruf kecil dan nombor.
  • Memandangkan rawak datang dari Math.random(), output mungkin boleh diramal dan oleh itu tidak semestinya unik.
  • Walaupun menganggap pelaksanaan yang ideal, output akan mempunyai paling banyak 52 bit entropi, yang bermaksud anda mungkin mendapat pendua selepas menjana ~70M rentetan.
P粉985686557

Jika anda hanya mahu membenarkan aksara tertentu, anda juga boleh melakukan ini:

function randomString(length, chars) {
    var result = '';
    for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
    return result;
}
var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

Berikut ialah jsfiddle untuk ditunjukkan: http://jsfiddle.net/wSQBx/

Pendekatan lain ialah menggunakan rentetan khas untuk memberitahu fungsi jenis aksara yang hendak digunakan. Anda boleh melakukan ini:

function randomString(length, chars) {
    var mask = '';
    if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
    if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    if (chars.indexOf('#') > -1) mask += '0123456789';
    if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\';
    var result = '';
    for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
    return result;
}

console.log(randomString(16, 'aA'));
console.log(randomString(32, '#aA'));
console.log(randomString(64, '#A!'));

Fiddle: http://jsfiddle.net/wSQBx/2/

Sebagai alternatif, untuk menggunakan kaedah base36 seperti yang diterangkan di bawah, anda boleh melakukan perkara berikut:

function randomString(length) {
    return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan