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)],''); }
概要:
- 创build一个我们想要的大小的数组(因为在JavaScript中没有等效的
range(len)
。- 对于数组中的每个元素:从
p
select一个随机字符并将其添加到string中- 返回生成的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)]
转换数组中的每个元素,将结果附加到a
string,并在完成时给我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)