JavaScript中的随机字母数字字符串?[重复]

2020/10/15 10:01 · javascript ·  · 0评论

在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)

关于此实现的注意事项:

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

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

(Math.random()*1e32).toString(36)

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

或基于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

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

_.times(20, () => _.random(35).toString(36)).join('');

这比较干净

Math.random().toString(36).substr(2, length)

Math.random().toString(36).substr(2, 5)

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

Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')

这取决于箭头函数的语法。

对于32个字符:

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
function randomString(len) {
    var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}

概要:

  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是我们要选择的字符串。您可以通过类似索引的字符串访问char(例如,"abcdefg"[3]给我们"d"

~~(Math.random()*p.length)

Math.random()返回[0,1)之间的浮点Math.floor(Math.random()*max) 是在javascript中获取随机整数的事实上的标准~是javascript中的按位NOT运算符。
~~是一种较短,有时可以说是更快,并且绝对是一种更有趣的表达方式,Math.floor( 下面是一些信息

随机字符:

String.fromCharCode(i); //where is an 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/

使用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>

随机密钥生成器

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"
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;
};

当我看到这个问题时,我想到了何时必须生成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();
}

小提琴: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通过我的测试,我能够获得长度为300,000个字符的字符串。

通过将字符串作为第二个参数发送到函数,可以将该函数转换为尾递归。我不确定JS是否使用尾部调用优化

简洁明了,不限于某些字符:

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)

本文地址:http://javascript.askforanswer.com/javascriptzhongdesuijizimushuzizifuchuanzhongfu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!