javascript中的随机字母数字字符串?

Random alpha-numeric string in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

在javascript中生成随机字母数字(大写、小写和数字)字符串作为可能唯一的标识符的最短方法是什么?


我只是觉得这是一个非常好和优雅的解决方案:

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

本实施说明:

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


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

1
2
3
4
5
6
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/

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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方法,您可以这样做:

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


jar.jar.beans建议的另一种答案变体

1
(Math.random()*1e32).toString(36)

通过更改乘数1e32可以更改随机字符串的长度。


或者根据jar jar的建议,这是我在最近的项目中使用的(为了克服长度限制):

1
2
3
4
5
6
7
8
9
10
11
var randomString = function (len, bits)
{
    bits = bits || 36;
    var outStr ="", newStr;
    while (outStr.length < len)
    {
        newStr = Math.random().toString(bits).slice(2);
        outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
    }
    return outStr.toUpperCase();
};

用途:

1
2
randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters

一个带有lodash的衬线,用于随机20个字符(字母数字小写):

1
_.times(20, () => _.random(35).toString(36)).join('');

这是清洁工

1
Math.random().toString(36).substr(2, length)

例子

1
Math.random().toString(36).substr(2, 5)


对于32个字符:

1
for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)

我认为以下是允许给定长度的最简单的解决方案:

Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')

它取决于箭头函数语法。


随机字符:

1
String.fromCharCode(i); //where is an int

随机INT:

1
Math.floor(Math.random()*100);

把它们放在一起:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function randomNum(hi){
    return Math.floor(Math.random()*hi);
}
function randomChar(){
    return String.fromCharCode(randomNum(100));
}
function randomString(length){
   var str ="";
   for(var i = 0; i < length; ++i){
        str += randomChar();
   }
   return str;
}
var RandomString = randomString(32); //32 length string

小提琴:http://jsfiddle.net/maniator/qz9j2/


1
2
3
4
function randomString(len) {
    var p ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}

总结:

  • Create an array of the size we want (because there's no range(len) equivalent in javascript.
  • For each element in the array: pick a random character from p and add it to a string
  • Return the generated string.
  • 一些解释:

    [...Array(len)]

    数组(len)或新数组(len)创建具有未定义指针的数组。一个衬里将很难拉下。扩展语法方便地定义指针(现在它们指向未定义的对象!).

    .reduce(

    在本例中,将数组缩减为单个字符串。reduce功能在大多数语言中都很常见,值得学习。

    a=>a+...

    我们使用的是箭头函数。

    a是蓄电池。在本例中,它是我们完成后将返回的最终结果字符串(您知道它是字符串,因为reduce函数的第二个参数,initialValue是空字符串:'')。因此,基本上:使用p[~~(Math.random()*p.length)]转换数组中的每个元素,将结果附加到a字符串,完成后给我a

    p[...]

    p是我们要从中选择的字符串。您可以像索引一样访问字符串中的字符(例如,"abcdefg"[3]给我们提供"d")

    ~~(Math.random()*p.length)

    Math.random()返回一个介于〔0,1〕之间的浮点,Math.floor(Math.random()*max)是获取javascript中随机整数的事实标准。~是javascript中的按位非运算符。~~是一个较短的,可以说有时更快,而且更有趣的说法,Math.floor(这里有一些信息


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var randomString = function(length) {
      var str = '';
      var chars ='0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split(
          '');
      var charsLen = chars.length;
      if (!length) {
        length = ~~(Math.random() * charsLen);
      }
      for (var i = 0; i < length; i++) {
        str += chars[~~(Math.random() * charsLen)];
      }
      return str;
    };


    使用LADAS:

    1
    2
    3
    4
    5
    6
    function createRandomString(length) {
            var chars ="abcdefghijklmnopqrstufwxyzABCDEFGHIJKLMNOPQRSTUFWXYZ1234567890"
            var pwd = _.sampleSize(chars, length || 12)  // lodash v4: use _.sampleSize
            return pwd.join("")
        }
    document.write(createRandomString(8))
    1
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js">


    当我看到这个问题时,我想到了何时必须生成UUID。我不能相信这段代码,因为我确信我是在stackoverflow上找到的。如果你不想让破折号出现在你的绳子里,那就把破折号去掉。功能如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function generateUUID() {
        var d = new Date().getTime();
        var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c) {
            var r = (d + Math.random()*16)%16 | 0;
            d = Math.floor(d/16);
            return (c=='x' ? r : (r&0x7|0x8)).toString(16);
        });
        return uuid.toUpperCase();
    }

    小提琴:http://jsfiddle.net/nlviands/fnpvf/11227/


    这个函数应该给出任意长度的随机字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    function randString(length) {
        var l = length > 25 ? 25 : length;
        var str = Math.random().toString(36).substr(2, l);
        if(str.length >= length){
            return str;
        }
        return str.concat(this.randString(length - str.length));
    }

    我用以下测试成功地测试了它。

    1
    2
    3
    4
    5
    6
    7
    function test(){
        for(var x = 0; x < 300000; x++){
            if(randString(x).length != x){
                throw new Error('invalid result for len ' + x);
            }
        }
    }

    我之所以选择25,是因为在实践中,从Math.random().toString(36).substr(2, 25)返回的字符串长度为25。这个号码可以随意更改。

    此函数是递归的,因此使用Maximum call stack size exceeded调用具有非常大值的函数可以得到结果。通过测试,我可以得到长度为300000个字符的字符串。

    通过将字符串作为第二个参数发送给函数,可以将此函数转换为尾部递归。我不确定JS是否使用尾调用优化


    随机密钥生成器

    key length参数是您要用于键的字符长度

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function keyGen(keyLength) {
        var i, key ="", characters ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        var charactersLength = characters.length;

        for (i = 0; i < keyLength; i++) {
            key += characters.substr(Math.floor((Math.random() * charactersLength) + 1), 1);
        }

        return key;
    }


    keyGen(12)
    "QEt9mYBiTpYD"

    美观简单,不限于一定数量的字符:

    1
    2
    3
    let len = 20, str ="";
    while(str.length < len) str += Math.random().toString(36).substr(2);
    str = str.substr(0, len);


    使用MD5库:https://github.com/blueimp/javascript-md5

    最短路线:

    md5(Math.random())

    如果要将大小限制为5:

    md5(Math.random()).substr(0, 5)