JavaScript中的随机字母数字字符串?

Pav*_*vel 189 javascript random

在JavaScript中生成随机字母数字(大写,小写和数字)字符串以用作可能唯一标识符的最短方式(在合理范围内)是什么?

JAR*_*ans 309

我刚认为这是一个非常好的优雅解决方案:

Math.random().toString(36).slice(2)
Run Code Online (Sandbox Code Playgroud)

关于此实施的说明:

  • 这将生成一个字符串,长度在0到12个字符之间,通常为11个字符,因为浮点字符串化会删除尾随零.
  • 它不会生成大写字母,只会生成小写字母和数字.
  • 因为随机性来自Math.random(),所以输出可以是可预测的,因此不一定是唯一的.
  • 即使假设一个理想的实现,输出最多有52位熵,这意味着在生成大约70M字符串后你可以期望重复.

  • 这里:http://stackoverflow.com/a/8084248/610573 (12认同)
  • 你有一个繁忙的网站吗?然后有时它会生成一个小于"0.000001"的随机数.较低数字的`toString()`类似于`3.4854687E-7`,你的随机字母数字字符串将是'4854687E-7`,它不再是字母数字.这不再符合OP的要求 (8认同)
  • 使用[`slice(2)`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/slice)代替`substr(2,16)`:http:/ /www.jacklmoore.com/notes/substring-substr-slice-javascript (4认同)
  • toString 采用基数参数,即整数转换为字符串的“基数”。我认为最容易理解的是 `var a = 5;a.toString(2)` ;将返回二进制格式的数字 5,即“101”。完整文档位于:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString (4认同)
  • 如果 `Math.random()` 返回 `0`,这将会中断。 (3认同)

Nim*_*ous 263

如果您只想允许特定字符,您也可以这样做:

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');
Run Code Online (Sandbox Code Playgroud)

这里有一个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!'));
Run Code Online (Sandbox Code Playgroud)

小提琴: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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Nimphious请给我你的推荐信.`Math.random()`永远不会返回1.它的返回值是`[0,1)`,表示包含0,排除1.以下是四个不同且重要的独立来源:Mozilla:http://goo.gl/BQGZiG; Microsoft MSDN(IE):http://goo.gl/MPuCJM; w3schools:http://goo.gl/qXrK7P; Stackoverflow:http://goo.gl/CUoyIT(`num`为`1`)和http://goo.gl/D9az3C和http://goo.gl/0mERDq.您认为1是Math.random()的可能值是什么?因为事实并非如此. (5认同)
  • 我冒昧地修复了代码中的统计错误.因为这是谷歌"随机javascript字符串"的最佳结果,所以有一个错误的答案是一种耻辱. (5认同)
  • 嗯,这里有一个统计错误.`Math.round(Math.random()*(chars.length - 1))`将给出`[0]`和`[chars.length-1]`的概率比其余字符的概率低一半.圆形到它们分别需要一个数字,间隔为"[0,0.5)"和"[chars.length-2 + 0.5,chars.length-1)",大小为0.5,而其余的字符需要`[index-0.5] ,索引+ 0.5)`大小1.正确的索引函数应该是:`parseInt(Math.random()*chars.length)`因为random()的上限被排除,`chars.length`将是no到达:http://www.w3schools.com/jsref/jsref_random.asp (2认同)

he-*_*aeh 28

JAR.JAR.beans建议的另一种答案变体

(Math.random()*1e32).toString(36)
Run Code Online (Sandbox Code Playgroud)

通过更改乘数,1e32您可以更改随机字符串的长度.

  • 很好的答案,这对我有所帮助.1e32我有19个字符长字符串和1e64我有40个.非常感谢! (2认同)
  • @BogdanLewis 请注意,不能保证字符串长度。意思是 1e64 并不总是产生 40 个字符长度的字符串,但它会接近 40。 (2认同)

Jos*_* Mc 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();
};
Run Code Online (Sandbox Code Playgroud)

使用:

randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters
Run Code Online (Sandbox Code Playgroud)


Die*_*llo 16

这比较干净

Math.random().toString(36).substr(2, length)
Run Code Online (Sandbox Code Playgroud)

Math.random().toString(36).substr(2, 5)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于> 16的长度 (3认同)

DS.*_*DS. 16

带有lodash的单行,随机20个字符(字母数字小写):

_.times(20, () => _.random(35).toString(36)).join('');
Run Code Online (Sandbox Code Playgroud)


Col*_*son 8

32个字符:

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
Run Code Online (Sandbox Code Playgroud)


Lás*_*nda 7

我认为以下是允许给定长度的最简单的解决方案:

__CODE__

它取决于箭头函数语法.


Nea*_*eal 6

随机字符:

String.fromCharCode(i); //where is an int
Run Code Online (Sandbox Code Playgroud)

随机int:

Math.floor(Math.random()*100);
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

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
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/maniator/QZ9J2/


ale*_*ehr 6

使用 lodash:

function createRandomString(length) {
        var chars = "abcdefghijklmnopqrstufwxyzABCDEFGHIJKLMNOPQRSTUFWXYZ1234567890"
        var pwd = _.sampleSize(chars, length || 12)  // lodash v4: use _.sampleSize
        return pwd.join("")
    }
document.write(createRandomString(8))
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • `_.sample()` 只返回一个字符。我想你的意思是`_.sampleSize()` (2认同)
  • 使用 lodash 生成随机的 CSS 十六进制颜色:`_.sampleSize("abcdef0123456789", 6).join("")` (2认同)

sea*_*ass 5

随机密钥生成器

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"
Run Code Online (Sandbox Code Playgroud)


rou*_*dar 5

function randomString(len) {
    var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}
Run Code Online (Sandbox Code Playgroud)

摘要:

  1. 创建一个我们想要的大小的数组(因为range(len)javascript中没有等价物.
  2. 对于数组中的每个元素:从中选择一个随机字符p并将其添加到字符串中
  3. 返回生成的字符串.

一些解释:

[...Array(len)]

Array(len)或new Array(len)创建一个带有未定义指针的数组.单行将更难实现.在传播语法方便地定义指针(现在他们指向不确定的对象!).

.reduce(

在这种情况下,将数组减少为单个字符串.reduce函数在大多数语言中都很常见,值得学习.

a=>a+...

我们正在使用箭头功能.

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) 是在javascript中获取随机整数的事实标准.~是javascript中的按位NOT运算符. ~~是一个较短的,可以说有时更快,更有乐趣的方式来说Math.floor( 这里有一些信息