搜索

首页  >  问答  >  正文

如何在JavaScript中生成随机的字母数字字符串?

在 JavaScript 中生成随机字母数字(大写、小写和数字)字符串以用作可能唯一标识符的最短方法(在合理范围内)是什么?

P粉775788723P粉775788723478 天前781

全部回复(2)我来回复

  • P粉312195700

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

    我刚刚发现这是一个非常好的和优雅的解决方案:

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

    此实现的注释:

    • 这将生成长度介于 0 到 12 个字符之间的字符串,通常为 11 个字符,因为浮点字符串化会删除尾随零。
    • 它不会生成大写字母,只会生成小写字母和数字。
    • 由于随机性来自 Math.random(),因此输出可能是可预测的,因此不一定是唯一的。
    • 即使假设实现理想,输出也最多具有 52 位熵,这意味着在生成大约 70M 字符串后,您可能会出现重复项。

    回复
    0
  • P粉985686557

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

    如果您只想允许特定字符,您也可以这样做:

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

    这里有一个 jsfiddle 来演示:http://jsfiddle.net/wSQBx/

    另一种方法是使用一个特殊的字符串来告诉函数要使用什么类型的字符。你可以这样做:

    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!'));

    小提琴:http://jsfiddle.net/wSQBx/2/

    或者,要使用如下所述的 base36 方法,您可以执行以下操作:

    function randomString(length) {
        return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
    }

    回复
    0
  • 取消回复