web-dev-qa-db-ja.com

JavaScriptでランダムな英数字の文字列?

おそらく一意の識別子として使用するために、JavaScriptでランダムな英数字(大文字、小文字、および数字)の文字列を生成する(理にかなった)最短の方法は何ですか?

184
Pavel

特定の文字だけを許可したい場合は、次のようにすることもできます。

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);
}
247
Nimphious

本当に素敵でエレガントな解決策として私はこれに出会った。

Math.random().toString(36).slice(2)

この実装に関する注意事項

  • これは、浮動小数点文字列化によって末尾のゼロが削除されるため、長さが0〜12文字、通常は11文字の文字列になります。
  • 大文字は生成されず、小文字と数字だけが生成されます。
  • ランダム性はMath.random()から来るため、出力は予測可能であり、したがって必ずしも一意ではありません。
  • 理想的な実装を想定しても、出力には最大52ビットのエントロピーが含まれます。つまり、約70Mの文字列が生成された後で重複が予想されます。
303
JAR.JAR.beans

JAR.JAR.beansによって提案されている答えの別の変形

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

乗数1e32を変えることで、ランダムな文字列の長さを変えることができます。

27
he-yaeh

あるいは、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
19
Josh Mc

ランダムな20文字(英数字の小文字)の場合は、lodash付きのワンライナー:

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

これはきれいです

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

Math.random().toString(36).substr(2, 5)
15
Diego Mello

32文字の場合:

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
8
Collin Anderson

私は以下が与えられた長さを可能にする最も簡単な解決策だと思います:

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

それは矢印関数の構文に依存します。

7
László Monda

ランダムな文字

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/

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

概要:

  1. 必要なサイズの配列を作成します(javascriptに同等のrange(len)がないため)。
  2. 配列の各要素に対して:pからランダムな文字を選び、それを文字列に追加する
  3. 生成された文字列を返します。

いくつかの説明:

[...Array(len)]

Array(len)またはnew Array(len) 未定義のポインタを持つ配列を作成します 。ワンライナーは引っ張り出すのが難しくなるでしょう。 Spread syntax は便利にポインタを定義します(現在は未定義のオブジェクトを指しています!)。

.reduce(

Reduce 配列を、この場合は単一の文字列にします。 reduce機能はほとんどの言語で一般的です そして学ぶ価値があります。

a=>a+...

我々は 矢印機能 を使っています。

aアキュムレータです。この場合、終了時に返される最終結果の文字列です(これは文字列だからです)。 reduce関数の2番目の引数である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(と言うより楽しい方法です ここでいくつかの情報があります

5
roundar

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>
2
Dr Hund
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;
};
2
Joey Dias

この質問を見たとき、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/

1
nlv

ランダムキージェネレーター

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"
1
seaBass

この関数は任意の長さのランダムな文字列を返すべきです。

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が返されることがあります。私のテストから私は30万文字の長さの文字列を取得することができました。

この関数は、文字列を2番目のパラメータとして関数に送信することで末尾再帰に変換できます。 JSがTail呼び出し最適化を使用しているかどうかわからない

1
Yaki Klein

わかりやすく単純で、特定の文字数に限定されません。

let len = 20, str = "";
while(str.length < len) str += Math.random().toString(36).substr(2);
str = str.substr(0, len);
1
user993683