cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk menjana rentetan alfanumerik rawak dalam JavaScript?

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粉775788723P粉775788723403 hari yang lalu714

membalas semua(2)saya akan balas

  • P粉312195700

    P粉3121957002023-10-13 12:38:49

    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.

    balas
    0
  • P粉985686557

    P粉9856865572023-10-13 09:56:40

    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);
    }

    balas
    0
  • Batalbalas