JavaScript中的随机字母数字string?

在JavaScript中生成随机字母数字(大写,小写和数字)string以作为可能唯一的标识符使用的最简单方法是什么?

如果你只想让特定的字符,你也可以这样做:

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/

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

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

我刚刚遇到这个非常漂亮和优雅的解决scheme:

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

JAR.JAR.beans提出的另一个答案变种

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

通过改变乘法器1e32你可以改变随机string的长度。

或者build立在Jar Jarbuild议的基础上,这是我在最近的一个项目中使用的(克服长度限制):

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

使用:

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

这是更清洁

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

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

随机字符:

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

随机int:

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

把它们放在一起:

 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/

为32个字符:

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

一行一行,随机20个字符(字母数字小写):

 _.times(20, () => _.random(35).toString(36)).join(''); 
 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; }; 

使用lodash:

 function createRandomString(length) { var chars = "abcdefghijklmnopqrstufwxyzABCDEFGHIJKLMNOPQRSTUFWXYZ1234567890" var pwd = _.sample(chars, length || 12) // lodash v4: use _.sampleSize return pwd.join("") } 

当我看到这个问题时,我想到了什么时候我必须生成UUID。 我不能赞赏代码,因为我确定我在这里find了它的计算器。 如果你不想在你的string破折号,然后拿出破折号。 这是function:

 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/

这个函数应该给任意长度的一个随机string。

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

我已经用下面的testing成功地testing了它。

 function test(){ for(var x = 0; x < 300000; x++){ if(randString(x).length != x){ throw new Error('invalid result for len ' + x); } } } 

我select25的原因是因为在实践中,从Math.random().toString(36).substr(2, 25)返回的string的长度为25,这个数字可以随意改变。

这个函数是recursion的,因此调用非常大的值的函数会导致Maximum call stack size exceeded 。 从我的testing中,我能够得到30万字符的string。

通过将string作为第二个参数发送给函数,可以将此函数转换为尾recursion。 我不确定JS是否使用尾部呼叫优化

随机密钥生成器

keyLength参数是您想要的密钥的字符长度

 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" 

好而简单,并不限于一定数量的字符:

 let len = 20, str = ""; while(str.length < len) str += Math.random().toString(36).substr(2); str = str.substr(0, len); 
 function randomString(len) { var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],''); } 

概要:

  1. 创build一个我们想要的大小的数组(因为在JavaScript中没有等效的range(len)
  2. 对于数组中的每个元素:从pselect一个随机字符并将其添加到string中
  3. 返回生成的string。

一些解释:

[...Array(len)]

数组(len)或新数组(len) 创build一个未定义指针的数组 。 一线车手将难以脱颖而出。 Spread语法方便地定义了指针(现在它们指向未定义的对象!)。

.reduce(

减less数组,在这种情况下,单个string。 减lessfunction在大多数语言中是常​​见的 ,值得学习。

a=>a+...

我们正在使用箭头function 。

a累加器。 在这种情况下,它是我们完成时返回的最终结果string(因为reduce函数的第二个参数, initialValue是一个空string: '' ,您知道这是一个string。 所以基本上:用p[~~(Math.random()*p.length)]转换数组中的每个元素,将结果附加到astring,并在完成时给我a

p[...]

p是我们从中select的string。 你可以像string一样访问string(例如, "abcdefg"[3]给了我们"d"

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

Math.random()返回[0,1)之间的浮点数Math.floor(Math.random()*max) 是在javascript中获得随机整数的事实标准 。 ~是javascript中的按位运算符。 ~~是一个更短,可以说有时更快,更确切地说是Math.floor( 这是一些信息

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

最短的方法:

md5(Math.random())

如果你想限制的大小为5:

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