我想要一个5个字符的字符串,由从集合[a-zA-Z0-9]中随机选取的字符组成。
用JavaScript实现这一点的最佳方法是什么?
我想要一个5个字符的字符串,由从集合[a-zA-Z0-9]中随机选取的字符组成。
用JavaScript实现这一点的最佳方法是什么?
当前回答
试试这个,我每次都用的:
函数myFunction(){var hash=“abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012346789”;var random8=“”;对于(变量i=0;i<5;i++){random8+=哈希[parseInt(Math.random()*hash.length)];}控制台日志(random8);document.getElementById(“demo”).innerHTML=“您的5个字符串==>”+random8;} <!DOCTYPE html><html><body><p>单击按钮生成5个字符的随机字符串</p><button onclick=“myFunction()”>单击我</button><p id=“demo”></p></body></html>
其他回答
我想这会对你有用:
函数makeid(长度){let result=“”;const characters=‘EFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789’;常量字符长度=字符长度;让计数器=0;while(计数器<长度){result+=characters.charAt(Math.floor(Math.random()*charactersLength));计数器+=1;}返回结果;}console.log(makeid(5));
这将在变量c中存储5个字母数字字符。
for(var c = ''; c.length < 5;) c += Math.random().toString(36).substr(2, 1)
function randomString (strLength, charSet) {
var result = [];
strLength = strLength || 5;
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
while (strLength--) { // (note, fixed typo)
result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));
}
return result.join('');
}
这是最干净的了。它也很快,http://jsperf.com/ay-random-string.
教人钓鱼:
程序员用激光切割纸张,而不是电锯。使用边缘的、特定于语言的方法来生成最小、最模糊的代码是非常可爱的,但永远不会提供完整的解决方案。你必须使用合适的工具来完成这项工作。
您需要的是字符串,字符由字节表示。而且,我们可以用数字在JavaScript中表示一个字节。因此,我们应该生成这些数字的列表,并将它们转换为字符串。你不需要Date或base64;Math.random()将获得一个数字,String.fromCharCode()将其转换为字符串。容易的
但是,哪个数字等于哪个字符?UTF-8是web上用于将字节解释为字符的主要标准(尽管JavaScript内部使用UTF-16,但它们是重叠的)。程序员解决这个问题的方法是查看文档。
UTF-8以0到128之间的数字列出键盘上的所有键。有些是非打印的。只需在随机字符串中选择所需的字符,然后使用随机生成的数字搜索它们。
Bellow是一个几乎无限长的函数,在循环中生成一个随机数,并搜索低128位UTF-8代码中的所有打印字符。熵是固有的,因为并非所有随机数每次都会命中(非打印字符、空格等)。当您添加更多字符时,它的执行速度也会更快。
我已经包含了线程中讨论的大多数优化:
双颚化符比Math.floor快“if”语句比正则表达式更快推送到数组比字符串串联更快
函数randomID(len){var字符;var arr=[];var len=长度||5;做{char=~~(Math.random()*128);如果(((字符>47和字符<58)| |//0-9(字符>64和字符<91)||//A-Z(字符>96和字符<123)//a-z//||(字符>32&&字符<48)//!"#$%&,()*+'-.///|(字符>59&&字符<65)//<=>@//|(字符>90&&字符<97)//[\]^_`//|(字符>123&&字符<127)//{|}~)//安全意识删除:“'\`//&&(char!=34&&char!=39&&char!=92&&char!=96)){arr.push(String.fromCharCode(char))}}而(arr.length<len);return arr.join(“”)}var input=document.getElementById('length');input.onfocus=函数(){input.value=“”;}document.getElementById('button').onclick=函数(){var view=document.getElementById(“字符串”);var is_number=str=>!编号.isNaN(parseInt(str));if(is_number(input.value))view.innerText=随机ID(input.value);其他的view.innerText='输入数字';}#长度,长度{宽度:3em;颜色:#484848;}#字符串{颜色:#E83838;字体系列:'sans-serif';换行:换行;}<input id=“length”type=“text”value=“#”/><input id=“button”type=“button“value=“Generate”/><p id=“string”></p>
为什么要用这种乏味的方式?因为你可以。你是个程序员。你可以让电脑做任何事情!此外,如果你想要一串希伯来语字符呢?这并不难。在UTF-8标准中查找这些字符并搜索它们。将自己从这些McDonald方法中解放出来,比如toString(36)。
有时,创建真正的解决方案需要降低抽象级别。了解手头的基本原理可以让您按照自己的意愿定制代码。也许你想要一个无限生成的字符串来填充一个循环缓冲区?也许你希望所有生成的字符串都是回文?为什么要克制自己?
从字符a-Za-z0-9中随机化字符串的另一种好方法:
function randomString(length) {
if ( length <= 0 ) return "";
var getChunk = function(){
var i, //index iterator
rand = Math.random()*10e16, //execute random once
bin = rand.toString(2).substr(2,10), //random binary sequence
lcase = (rand.toString(36)+"0000000000").substr(0,10), //lower case random string
ucase = lcase.toUpperCase(), //upper case random string
a = [lcase,ucase], //position them in an array in index 0 and 1
str = ""; //the chunk string
b = rand.toString(2).substr(2,10);
for ( i=0; i<10; i++ )
str += a[bin[i]][i]; //gets the next character, depends on the bit in the same position as the character - that way it will decide what case to put next
return str;
},
str = ""; //the result string
while ( str.length < length )
str += getChunk();
str = str.substr(0,length);
return str;
}