在JavaScript中生成随机字母数字(大写,小写和数字)字符串以用作可能唯一标识符的最短路径(在合理范围内)是什么?
答案 0 :(得分:303)
我刚认为这是一个非常好的优雅解决方案:
Math.random().toString(36).slice(2)
有关此实施的说明:
Math.random()
,因此输出可能是可预测的,因此不一定是唯一的。答案 1 :(得分:246)
如果您只想允许特定字符,您也可以这样做:
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');
这是一个证明:http://jsfiddle.net/wSQBx/
的jsfiddle另一种方法是使用一个特殊的字符串来告诉函数使用哪种类型的字符。你可以这样做:
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);
}
答案 2 :(得分:27)
JAR.JAR.beans建议的另一种答案
(Math.random()*1e32).toString(36)
通过更改乘数1e32
,您可以更改随机字符串的长度。
答案 3 :(得分:19)
或者建立在Jar Jar建议的基础上,这是我在最近的项目中使用的(克服长度限制):
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
答案 4 :(得分:16)
带有lodash的单行,随机20个字符(字母数字小写):
_.times(20, () => _.random(35).toString(36)).join('');
答案 5 :(得分:15)
这是更干净的
Math.random().toString(36).substr(2, length)
实施例
Math.random().toString(36).substr(2, 5)
答案 6 :(得分:8)
包含32个字符:
for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
答案 7 :(得分:7)
我认为以下是允许给定长度的最简单的解决方案:
Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')
这取决于箭头函数语法。
答案 8 :(得分:6)
随机字符:
String.fromCharCode(i); //where is an int
Random 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
答案 9 :(得分:5)
function randomString(len) {
var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}
要点:
- 创建一个我们想要的大小的数组(因为javascript中没有
range(len)
等效。- 对于数组中的每个元素:从
p
中选择一个随机字符并将其添加到字符串- 返回生成的字符串。
醇>
一些解释:
[...Array(len)]
Array(len)或new Array(len)creates an array with undefined pointer(s)。单行将更难实现。 Spread syntax方便地定义指针(现在它们指向未定义的对象!)。
.reduce(
Reduce数组,在本例中为单个字符串。 The reduce functionality is common in most languages值得学习。
a=>a+...
我们正在使用arrow function。
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)
is the de facto standard for getting a random integer in javascript之间的浮点数。 ~
是javascript中的按位NOT运算符。
~~
是一种较短的,可称有时更快,更有趣的方式来说Math.floor(
Here's some info
答案 10 :(得分:2)
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;
};
答案 11 :(得分:2)
使用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>
答案 12 :(得分:1)
此函数应提供任意长度的随机字符串。
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
。根据我的测试,我能够获得300,000个字符的字符串。
通过将字符串作为第二个参数发送到函数,可以将此函数转换为尾递归。我不确定JS是否使用Tail调用优化
答案 13 :(得分:1)
随机密钥生成器
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"
答案 14 :(得分:1)
美观而简单,并且不限于一定数量的字符:
let len = 20, str = "";
while(str.length < len) str += Math.random().toString(36).substr(2);
str = str.substr(0, len);
答案 15 :(得分:1)
当我看到这个问题时,我想到了何时必须生成UUID。我无法承认代码,因为我确信我在stackoverflow上找到了它。如果您不想在字符串中使用破折号,请取出破折号。这是功能:
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();
}
答案 16 :(得分:0)
这是生成随机字符串字母表的简单代码。
看看这段代码是如何工作的。
go(lenthOfStringToPrint);
- 使用此函数生成最终字符串。
var letters = {
1: ["q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m"],
2: ["Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M"]
},i,letter,final="";
random = (max,min) => {
return Math.floor(Math.random()*(max-min+1)+min);
}
function go(length) {
final="",letter="";
for (i=1; i<=length; i++){
letter = letters[random(0,3)][random(0,25)];
final+=letter;
}
return final;
}
答案 17 :(得分:-2)
使用md5库:https://github.com/blueimp/JavaScript-MD5
最短路:
md5(Math.random())
如果要将大小限制为5:
md5(Math.random()).substr(0, 5)