这个问题已经在这里有一个答案:
- 生成随机字符串/ JavaScript中的字符 63个回答
什么是(在合理范围内)生成一个随机的字母数字的最短途径(大写字母,小写字母和数字)在JavaScript字符串作为一个可能唯一标识符使用?
这个问题已经在这里有一个答案:
什么是(在合理范围内)生成一个随机的字母数字的最短途径(大写字母,小写字母和数字)在JavaScript字符串作为一个可能唯一标识符使用?
如果你只想让特定的字符,你也可以做这样的:
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);
}
我只是碰到这个来作为一个非常好的和优雅的解决方案:
Math.random().toString(36).slice(2)
注意在此实现:
Math.random()
则输出可以是可预测的,因此不一定是唯一的。 通过JAR.JAR.beans建议答案的另一个变化
(Math.random()*1e32).toString(36)
通过改变乘数1e32
你可以改变随机字符串的长度。
还是要建立在什么样瓶瓶建议,这是我在最近的一个项目中使用(克服长度的限制):
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
单行与lodash,用于随机20个字符(字母数字小写):
_.times(20, () => _.random(35).toString(36)).join('');
这是清洁
Math.random().toString(36).substr(2, length)
例
Math.random().toString(36).substr(2, 5)
对于32个字符:
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('')
这取决于箭头函数的语法。
随机字符:
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/
function randomString(len) {
var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}
摘要:
- 创建我们希望大小的数组(因为没有
range(len)
相当于在JavaScript。- 对于数组中的每个元素:从选择一个随机字符
p
,并将其添加到字符串- 返回生成的字符串。
一些解释:
[...Array(len)]
阵列(LEN)或新阵列(LEN) 创建具有未定义的指针(多个)的阵列 。 单行将是很难拉断。 在传播语法方便地定义指针(现在他们指向不确定的对象!)。
.reduce(
减少的阵列,在这种情况下,一个单一的字符串。 该降低的功能是最常见的语言和值得借鉴。
a=>a+...
我们使用的箭头功能 。
a
是累加器。 在这种情况下,它是我们要去当我们完成返回最终结果字符串(你知道这是一个字符串,因为第二个参数减少功能, 初值为空字符串: ''
)。 所以基本上:转换每个元素与数组中的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中按位NOT运算符。 ~~
是较短的,有时可以说是快了,绝对funner的方式来表达Math.floor(
这里的一些信息
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 = _.sampleSize(chars, length || 12) // lodash v4: use _.sampleSize return pwd.join("") } document.write(createRandomString(8))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
当我看到这个问题,我想,当我不得不产生的UUID。 我不能把信贷的代码,因为我相信我在这里找到的计算器。 如果您在字符串不想破折号然后取出破折号。 下面是函数:
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/
这个功能应该给任意长度的随机字符串。
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));
}
我用下面的测试成功进行了测试。
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
。 从我的测试中,我能得到字符串中的30万个字符长度。
这个功能可以通过作为第二参数发送的字符串的功能被转换成一个尾递归。 我不知道,如果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);
使用MD5库: https://github.com/blueimp/JavaScript-MD5
最短路径:
md5(Math.random())
如果你想大小限制为5:
md5(Math.random()).substr(0, 5)