-
91 警告:所有答案都没有 真随机 结果! 他们只是 伪随机 。当使用随机字符串进行保护或安全时,不要使用任何字符串!!! 尝试以下api之一: 随机网站 – 罗恩·范德海登 评论 2013年5月29日11:33 -
22 注释 HTML5网络加密随机性API 提供真正的随机性。 – 米凯马卡纳 评论 2016年1月9日16:54 -
8 如果这里有人想要生成id或唯一标识符,那么让您的DB来完成这项工作,或者使用UUID库。 – 丹 评论 2019年8月13日19:05 -
使用javascript、Java、Python、Rust、bash的随机字符串 – cwtuan公司 评论 2022年12月21日7:46 -
尝试npm库 随机-文本 – Bipul公司 评论 2023年10月30日9:38
94答案
函数makeid(长度){ 让结果=“”; const characters=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789”; const charactersLength=characters.length; 让计数器=0; while(计数器<长度){ 结果+=characters.charAt(Math.floor(Math.random()*charactersLength)); 计数器+=1; } 返回结果; } console.log(makeid(5));
-
126 -
5 看起来可能不对,但是 地板 不需要:for(var text='';text.length<5;)text+=possible.charAt(Math.random()*possible.length) – 科林·安德森 评论 2013年2月27日22:43 -
11 -
22 @乔纳森·保尔森 给我看数字 。请使用jsperf链接或 jsperf.com/sad-tragedy-of-micro优化 或 sitepen.com/blog/2008/05/09/string-performance-an-analysis网站 另外,这个问题只涉及5个串联。 – 亚历克斯·里斯 评论 2013年5月7日22:34 -
26
//可以将7更改为2以获得更长的结果。 设r=(Math.random()+1).toString(36).substring(7); console.log(“随机”,r);
它将生成0到6个字符之间的任意字符,这是因为字符串化浮点时去掉了尾随的零。 它在很大程度上依赖于用于字符串化浮点数的算法,这非常复杂。 (见论文 “如何准确打印浮点数字” .) 数学随机数() 根据实现,可能会产生可预测的(“随机”,但不是真正随机的)输出。 当需要保证唯一性或不可预测性时,结果字符串不适用。 即使它生成了6个统一的随机、不可预测的字符,由于 生日悖论 .(平方码(36^6)=46656)
-
332 -
86 @独家报道 到字符串 javascript中数字类型的方法采用一个可选参数将数字转换为给定的基数。 例如,如果您传递2,您将看到您的数字以二进制表示。 与十六进制(以16为基数)类似,以36为基数使用字母表示9以外的数字。 通过将一个随机数转换为以36为基数,你将得到一堆看似随机的字母和数字。 – 克里斯·贝克 评论 2013年1月3日20:45 -
85 -
82 -
35
var crypto=require(“crypto”); var id=crypto.randomBytes(20).toString('hex'); //“bb5dc8842ca31d4603d6aa11448d1654”
const id=window.crypto.randomUUID() console.log(id) //bd4d099b-3d39-4aad-a59c-c45dfac8eaf0
这个
crypto.getRandomValues() 方法可以获得加密的强随机值。 作为参数给出的数组由随机数填充(密码意义上的随机数)。
//dec2hex::Integer->字符串 //即0-255->'00'-'f' 功能dec2hex(dec){ return dec.toString(16).padStart(2,“0”) } //generateId::Integer->字符串 函数生成器ID(len){ var arr=新的Uint8数组((len||40)/2) window.crypto.getRandomValues(arr) return Array.from(arr,dec2hex).join(“”) } console.log(generateId()) //“82defcf324571e70b0521d79cce2bf3fffccd69” console.log(生成ID(20)) //“c1a050a4cd1556948d41”
>var arr=new Uint8Array(4)#make 4字节数组(值0-255) >阿珥 Uint8Array(4)[0,0,0,0] >窗口.加密 加密{精细:精细加密} >window.crypto.getRandomValues() TypeError:Crypto.getRandomValues需要至少1个参数,但只传递了0个 >window.crypto.getRandomValues(arr) Uint8Array(4)[235、229、94、228]
(window.crypto ||window.msCrypto).getRandomValues(arr)
const uuid=要求(“uuid”); 常量id=uuid.v4(); //“110ec58a-a0f2-4ac4-8393-c866d813b8d1”
-
7 -
三 无需 .map() 选项3中。 数组.from(arr,dec2hex).join(“”) === 数组.from(arr).map(dec2hex).join('') 。感谢您向我介绍这些功能:-) – 弗雷德·甘特 评论 2017年5月11日19:28 -
7 -
12 -
1
简短、简单、可靠
Math.random().toString(36).slice(2,7);
-
25 -
8 好吧,这是@Aperçu提出的一个有趣的控诉,我并不是说我发明了这个解决方案,但我已经在我的项目中使用了多年。 这与你提到的评论无关。 我非常确信,在SO中,最重要的是在正确的地方提供最有用的信息,即使它已经存在于其他地方。 幸运的是,似乎至少有51个人发现这个答案很有用,不客气! – 银色林吉特 评论 2017年3月5日11:10 -
6 @rinogo Math.random()可以返回0,但不能返回1 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… – 米凯普 评论 2017年8月4日9:54 -
11 我运行了这段代码1000000000次,仍然没有得到一个空字符串:jsfiddle.net/mtp5730r我想说,得到空字符串是很安全的。 评论 2018年7月19日13:39 -
26
(Math.random().toString(36)+00000000000000000').slice(2,N+2)
数组(N+1).join((Math.random().toString(36)+'00000000000000').slice(2,18)).slic(0,N)
选择[0,1)范围内的一个随机数,即介于0(包含)和1(不包含)之间。 将数字转换为以36为基数的字符串,即使用字符0-9和a-z。 用零填充(解决第一个问题)。 切掉前导的“0.”前缀和额外的填充零。 重复字符串足够多次,使其至少包含N个字符(通过将空字符串与用作分隔符的较短随机字符串连接)。 从字符串中精确切分N个字符。
这个解决方案不使用大写字母,但在几乎所有情况下(没有双关语),这并不重要。 原始答案中N=16时的最大字符串长度是用Chrome测量的。 在Firefox中是N=11。 但如前所述,第二种解决方案是支持任何请求的字符串长度,而不是增加随机性,因此没有太大区别。 至少在Math.random()返回的结果均匀分布的情况下,所有返回的字符串返回的概率相等(在任何情况下,这都不是加密强度随机性)。 不能返回所有可能的大小为N的字符串。 在第二种解决方案中,这是显而易见的(因为较小的字符串只是被复制),但在原始答案中也是如此,因为在转换为base-36的过程中,最后几位可能不是原始随机位的一部分。 具体来说,如果您查看Math.random().toString(36)的结果,您会注意到最后一个字符并不是均匀分布的。 同样,在几乎所有情况下,这都无关紧要,但我们从随机字符串的开头而不是末尾切割最后一个字符串,这样短字符串(例如N=1)就不会受到影响。
他们使用明确的任意字母表(更通用,适用于要求大写字母和小写字母的原始问题)。 所有长度为N的字符串返回的概率相等(即字符串不包含重复)。 它们基于一个map函数,而不是toString(36)技巧,这使得它们更加简单易懂。
var s=“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”;
数组(N).join().split(',').map(function(){returns s.charAt(Math.floor(Math.random()*s.length));}).jjoin('');
Array.apply(null,Array(N)).map(function(){returns s.charAt(Math.floor(Math.random()*s.length));}).join('');
-
-
-
-
Array.apply(null,{length:5}).map(function(){returns s.charAt(Math.floor(Math.random()*s.length));}).join('') – 穆罕默德·乌默尔 评论 2015年11月13日14:54 -
Math.random().toString(36).slice(-5);
(+new Date).toString(36).slice(-5);
btoa(Math.random()).slice(0,5); btoa(+新日期)。切片(-7,-2); btoa(+新日期).substr(-7,5);
//使用Math.random和Base 36: console.log(Math.random().toString(36).slice(-5)); //使用新的日期和基准36: console.log((+new Date).toString(36).slice(-5)); //使用Math.random和Base 64(btoa): console.log(btoa(Math.random()).slice(0,5)); //使用新的日期和基数64(btoa): console.log(btoa(+new Date).slice(-7,-2)); console.log(btoa(+new Date).substr(-7,5));
-
-
-
三 完全正确。;) 如果 数学随机数() 收益 0.5 结果是 “0.i” 。不确定是否存在其他边缘情况。 只是想指出,这不是问题的正确答案([a-zA-Z0-9]中的5个字符)。 – x射线 评论 2019年7月13日12:27 -
2 @x射线,我不想说这是正确的答案,我只是说这是上面@doubletap答案的紧凑版本。 我个人使用 (+新日期+数学随机数()) 以防止发生这种情况。 无论如何,谢谢你的留言。 评论 2019年7月13日16:39 -
1 为什么不使用 植物学 完全? 我对其他答案发表了评论,但使用这个测试用例,您可以看到base64必须提供的64个字符中只有14个字符: […new Set([…Array(100000)].map(()=>btoa(Math.random()).substr(0,5)).jjoin(“”)].sort() – 或段 评论 2020年11月14日7:34
这个 30 是一个任意数字,您可以选择所需的任何令牌长度 这个 36 是可以传递给的最大基数 numerical.toString() ,这意味着 所有数字和a-z小写字母 这个 2 用于从如下所示的随机字符串中选择第三个索引: “0.mfbiohx64i” ,我们可以在之后获取任何索引 0
-
-
-
@NahuelGreco可以执行[…Array(30)].map(()=>Math.random().toString(36)[2]).join('').toUpperCase() – 塔姆·泰克西拉 评论 2020年7月20日0:56 -
-
2
函数randomString(len,charSet){ charSet=charSet ||'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var randomString=“”; 对于(var i=0;i<len;i++){ var randomPoz=数学.floor(Math.random()*charSet.length); randomString+=charSet.substring(randomPoz,randomPoz+1); } return randomString; }
var randomValue=randomString(5); var randomValue=randomString(5,'PICKCHARSFROMTHISSET');
-
-
2 -
-
如果要公开使用这些元音,那么您可能应该删除元音。 熵稍微小一些,但安全得多,因为你不能说出任何可能冒犯别人的话。 这就是我喜欢这个的原因,因为我可以发送自己的字符串。干得好。 – 内特·本尼 评论 2017年4月18日18:22 -
函数randomstring(L){ var s=“”; var randomchar=函数(){ var n=数学地板(Math.random()*62); 如果(n<10),则返回n// 1-10 如果(n<36)返回String.fromCharCode(n+55)// A-Z(A-Z) 从CharCode返回String.(n+61)// a-z型 } 而(s.length<L)s+=randomchar(); 返回s; } console.log(randomstring(5));
-
我最喜欢这个。 您可以很容易地修改以接受额外的参数,并且只返回nums、lowers或caps。 我认为没有必要使用超压缩样式 而(s.length<L)s+=randomchar(); – 马斯塔布拉斯塔 评论 2014年1月17日19:24 -
三 -
三 最好使用更健壮的 “A”.charCodeAt(0) 而不是神奇的数字 55 (同样,对于 61 ). 特别是因为,无论如何,在我的平台上,返回的神奇数字是 65 。该代码也能更好地进行自我记录。 评论 2017年7月10日6:00 -
随机字符串生成器(Alpha-Numeric|Alpha|Numeric)
/** *伪随机字符串生成器 * http://stackoverflow.com/a/27872144/383904 *默认值:返回随机字母数字字符串 * *@param{Integer}len所需长度 *@param{String}an可选(字母数字)、“a”(字母)、“n”(数字) *@return{String} */ 函数randomString(len,an){ an=一个&&an.toLowerCase(); var str=“”, i=0, min=an==“a”? 10:0, max=an==“n”? 10 : 62; 对于(;i++<len;){ var r=数学随机数()*(max-min)+min<<0; str+=String.fromCharCode(r+=r>9?r<36?55:61:48); } 返回str; } console.log(randomString(10));// 即:“4Z8iNQag9v” console.log(randomString(10,“a”));// 即:“aUkZuHNcWw” console.log(randomString(10,“n”));// 即:“9055739230”
创建一个接受参数的函数(随机String结果所需的长度) 创建一个空字符串,如 var str=“”; 连接随机字符 在循环内部 创建 兰特 索引编号 从 0到61 (0..9+A..Z+A..Z=62) 创建一个 条件逻辑 到 调整/修复 兰特 (因为它是0..61)将其增加一些数字(参见下面的示例)以返回正确值 字符码 数字和相关字符。 在循环内部连接到 字符串 一 字符串.fromCharCode(递增rand)
_____0….9 ______ A……….Z ______ A…….Z ___________字符 |10||26||26|总计=62个字符 48….57 65…….90 97…….122字符代码范围
|rand | charCode |(0..61)rand+=fix=charCode范围| ------+----------+----------+--------------------------------+-----------------+ 0..9|0..9|48..57|rand+=48=48..57| A..Z|10..35|65..90|兰特+=55/*90-35=55*/=65..90| a..z|36..61|97..122|rand+=61/*122-61=61*/=97..122|
兰德+=兰德>9? (兰特<36?55:61):48; //rand+=真? (对吗?其他55人61人)其他48人;
函数randomString(len){ var str=“”;// 字符串结果 for(var i=0;i<len;i++){//循环`len`次 var rand=数学地板(Math.random()*62);// 随机:0..61 var charCode=rand+=rand>9? (兰特<36?55:61):48;// 获取正确的charCode str+=字符串.fromCharCode(charCode);// 将字符添加到str } return str;// 完成所有循环后,返回连接的字符串 } console.log(randomString(10));// 即:“7GL9F0ne6t”
const randomString=(n,r=“”)=>{ 而(n-)r+=String.fromCharCode((r=Math.random()*62|0,r+=r>9? (r<36?55:61):48); 返回r; }; console.log(randomString(10))
btoa(Math.random().toString()).substring(10,15);
缓冲区.from(Math.random().toString()).toString(“base64”).substring(10,15);
-
6 -
添加@Leif注释后,只会生成介于 1-5封,52封信中只有19封 ! (大写和小写)要进行测试,只需多次运行, 设置 它可以查看唯一的字符,然后进行排序。一行代码: […new Set([…Array(100000)].map(()=>btoa(Math.random()).substr(5,5)).jjoin(“”)].sort() – 或段 评论 2020年11月14日7:19 -
-
-
1
(新日期%9e6).toString(36)
(0|Math.random()*9e6).toString(36)
-
我不太确定这是如何回答这个问题的; 这是一个已有7年历史的问题,已有许多有效答案。 如果你选择提供一个新的答案,你真的应该格外小心,确保你的答案得到很好的解释和记录。 – 克莱斯 评论 2015年3月11日22:01 -
1 -
2 我想要一个长的随机字符串和一个短的尽可能的例程(用于代码演示),它不需要密码技术上的惊人,只需要生成一些漂亮的随机视觉“fluff”。 我最喜欢这个答案(你的第二个),所以谢谢你。 我的两美分:我只需少敲一次键就可以打败它,它通常会产生13个随机字符(没有句点): (数学.random()*1e20).toString(36) . – 安德鲁·威廉姆斯 评论 2016年2月27日19:11 -
1 -
1
包括 0-9a-z
new数组(5).join().replace(/(.|$)/g,function(){return((Math.random()*36)|0).toString(36);})
其中 0-9a-zA-Z
new Array(5).join().replace(/(.|$)/g,function(){return((Math.random()*36)|0).toString(36)[Math.rendom()<.5?“toString”:“toUpperCase”]();});
用于ES6的Codegolfed( 0-9a-z
)
数组(5).fill().map(n=>(Math.random()*36|0).toString(36)).join('')
函数readableRandomStringMaker(长度){ for(var s='';s.length<length;s+='abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.charAt(Math.random()*62|0)); 返回s; } console.log(readableRandomStringMaker(长度)); //电子3cbN
const compactRandomStringMaker=(length)=>length--&&“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”.charAt(Math.random()*62|0)+(compactRandomStringMaker(length||“”); console.log(compactRandomStringMaker(5)); //DVudj公司
数组(5).fill().map(()=>“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”.charAt(Math.random()*62)).join(“”) //东经12度
“”“.replaceAll(”“,()=>”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789“.charAt(Math.random()*62))
((l,f=(p='')=>p.长度<l? f(p+String.fromCharCode(Math.random()*123).replace(/[^a-z0-9]/i,'')):p)=>f())(5)
[…crypto.getRandomValues(new Uint8Array(999))].map((c)=>String.fromCharCode(c).replace(/[^a-z0-9]/i,'')).join(“”).substr(0,5) //8平方英尺
(f=(p=“”)=>p.长度<5? f(p+String.fromCharCode(Math.random()*123).replace(/[^a-z0-9]/i,'')):p)=>f())() //电动汽车6c9
((l,s=((l)=>l--&&“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”.charAt(数学随机数()*62|0)+(s(l)||“”))=>s(1))(5); //qzal4号机组
const c=新类{[Symbol.toPrimitive](){return“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”.charAt(Math.random()*62|0)}}; console.log(c+c+c~+c+c); //AgMnz公司
const c=()=>“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”.charAt(数学.random()*62|0); c()+c()+c()+c()+c(); //6卡德夫
函数rand(长度,电流){ 电流=电流? 当前:“”; 返回长度? rand(--长度,“0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz”.charAt(数学地板(数学.random()*60))+当前):当前; } 控制台.log(rand(5));
函数生成器UID(长度) { return window.btoa(String.fromCharCode(…window.crypto.getRandomValues(new Uint8Array(length*2))).replace(/[+/]/g,“”).substring(0,length); } console.log(生成UID(22));// “yFg3以上v2cE9cKOXd7hHwWp” console.log(生成UID(5));// “YQGzP”
Array.apply(0,Array(5)).map(function()){ return(函数(字符集){ return charset.charAt(数学地板(Math.random()*charset.length)) }('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'); }).join(“”)
const c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' const s=[…数组(5)].map(_=>c[~~(Math.random()*c.length)]).join('')
重复 创建5个字符(可以概括为 n个 ) 代替 带正则表达式 /./ 克 替换这5个字符 公式是从62个字符的a-Za-z0-9字符串中随机选取一个字符
设ans=“x”。重复(5) .替换(/./g,c=>“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”[数学地板(Math.random()*62)]); 控制台.log(ans);
函数randString(x){ var s=“”; while(s.length<x&&x>0){ var r=数学随机数(); s+=字符代码中的字符串(数学地板(r*26)+(r>0.5?97:65)); } 返回s; }
var s=“”; while(s.length<x&&x>0){ v=数学随机数()<0.5? 32:0; s+=String.fromCharCode(数学.round(Math.random()*((122-v)-(97-v))+(97-v)); }
数组(15).fill(null).map(()=>Math.random().toString(36).substr(2)).join(“”) //输出:0h61cbpw96y83qtnuwme5lxk1i70a6o5r5lckfcyh1dl9fffydcfxddd69ada9tu9jvqdx864xj1ul3wtfztmh2oz2vs3mv6ej0fe58ho1cftkjcuyl2lfkmxlwua83ibotxqc4guyuvrvtf60naob26t6swzpil
数组.from({length:1},()=>Math.random().toString(36)[2]).join('');
函数randomString(strLength,charSet){ var结果=[]; strLength=strLength||5; charSet=charSet ||'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; while(strLength--){//(注意,修复了输入错误) result.push(charSet.charAt(Math.floor(Math.random()*charSet.length)); } return result.join(“”); }
函数getRandomId(长度){ if(!长度){ 返回“”; } 常量可能= 'EFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789'; let数组; if(self中的'Uint8Array'和self&&length中的'crypto'<=65536){ array=新Uint8Array(长度); self.crypto.getRandomValues(数组); }其他{ array=新数组(长度); for(设i=0;i<长度;i++){ array[i]=数学地板(Math.random()*62); } } 让结果=“”; for(设i=0;i<长度;i++){ result+=可能。charAt(array[i]%62); } 返回结果; }
var possible=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnomqrstuvxyz0123456789”; var字符串长度=5; 函数pickRandom(){ return possible[Math.floor(Math.random()*possible.length)]; } var randomString=Array.apply(null,Array(stringLength)).map(pickRandom).jjoin('');
var randomString=Array.from({length:stringLength},pickRandom).join('');
函数randomDNA(len){ len=长度||100 var nuc=新数组(“A”、“T”、“C”、“G”) var i=0 var n=0 s=“” while(i<=len-1){ n=数学地板(Math.random()*4) s+=nuc[n] 我++ } 返回s } console.log(randomDNA(5));
不区分大小写的字母数字字符:
函数randStr(len){ 设s=''; while(s.length<len)s+=Math.random().toString(36).substr(2,len-s.length); 返回s; } //使用 console.log(randStr(50));
区分大小写的所有字符:
函数randStr(len){ 设s=''; while(len--)s+=String.fromCodePoint(Math.floor(Math.random()*(126-33)+33)); 返回s; } //用法 console.log(randStr(50));
自定义字符
函数randStr(len,chars='abc123'){ 设s=''; while(len--)s+=chars[Math.floor(Math.random()*chars.length)]; 返回s; } //使用 console.log(randStr(50)); 控制台.log(randStr(50,'abc')); console.log(randStr(50,'aab'));// a多于b
从“Entropy-string”导入{Random,Entropy} const random=新随机() 常量位=熵位(5e6,1e12) const字符串=random.string(位)
“44hTNghjNHGGRHqH9”
从'导入{Random、Entropy、charSet16}/ 熵弦 const random=新随机(charSet16) 常量位=熵位(5e6,1e12) const字符串=random.string(位)
“27b33372ade513715481f”