【JavaScript】ランダムな文字列を生成する

これまで何度書いたか思えていないほど頻繁に必要であったにもかかわらず、毎度、ゼロから考えてコードを書いていた処理、それがランダムな文字列の生成。

主にバックエンドを node.js で開発するときに良く必要となるわけですが、ゼロから考えてコードを書くと、そこそこ時間が取れられるので、コピペですぐに使えるよう、また、カスタマイズしやすい形で記事化しておきます。皆様にも少しでもお役に立てれば幸いです。

Math.random() を使う方法

かなり古いブラウザーでも動作する最もオーソドックスな書き方でしょうか。node.js でも動作します。

function createRandomString() {
  const S = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const L = 64;
  let rnd = '';
  for (var i = 0; i < L; i++) {
    rnd += S.charAt(Math.floor(Math.random() * S.length));
  }
  return rnd;
}

console.log(createRandomString());

変数 S に生成文字列に利用可能な文字を記述しておきます。また、変数 L は生成文字列の文字長です。

crypto.getRandomValues() を使う方法 (ブラウザーのみ)

こちらは前述の Math.random() よりランダム度が良いはず。しかし node.js では動作しません。

function createRandomStringCrypto() {
  const S = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const L = 64;
  let array = new Uint8Array(L);
  window.crypto.getRandomValues(array);
  let rnd = '';
  for (var i = 0; i < L; i++) {
    rnd += S.charAt(Math.floor((array[i] / 256) * S.length));
  }
  return rnd;
}

いくら crypto.getRandomValues() を使う方法ほうがランダム度が良いといっても、暗号鍵を生成できるほど信頼できるものではないようです。

crypto.randomBytes() を使う方法 (node.js のみ)

これは node.js 専用です。Math.random() を使うよりは良いのではないでしょうか。

const crypto = require('crypto');

function createRandomString() {
  const S = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const L = 64;
  let buf = crypto.randomBytes(L);
  let rnd = '';
  for (var i = 0; i < L; i++) {
    rnd += S.charAt(Math.floor((buf[i] / 256) * S.length));
  }
  return rnd;
}
Share