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) |
通过更改乘数
或者根据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) |
我认为以下是允许给定长度的最简单的解决方案:
它取决于箭头函数语法。
随机字符:
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 stringReturn the generated string.
一些解释:
数组(len)或新数组(len)创建具有未定义指针的数组。一个衬里将很难拉下。扩展语法方便地定义指针(现在它们指向未定义的对象!).
在本例中,将数组缩减为单个字符串。reduce功能在大多数语言中都很常见,值得学习。
我们使用的是箭头函数。
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,是因为在实践中,从
此函数是递归的,因此使用
通过将字符串作为第二个参数发送给函数,可以将此函数转换为尾部递归。我不确定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
最短路线:
如果要将大小限制为5: