簡易パスワード生成ブックマークレット2010年01月21日 05時10分08秒

たいした話じゃないのだが

ちょっとWEPキーを生成したくなったので、ずいぶん前に取り上げた、Number#toStringで生成してみた。とりあえずはFirebugのコンソールでちょろっと実行して済ませたのだが、ちょっと思いつきがあったのでブックマークレットにしてみることに。

このリンクをクリックすると、数字とアルファベットの小文字のランダムな組み合わせで長さ16の文字列を生成。クリップボードにコピーできるよう、生成結果表示にはprompt()を使用。

Firefox3.5/IE 5.5~8(IETester使用)/Opera9.6/Safari 4/Google Chrome 3で動作確認してます。

生成部分のコードは展開するとこんな感じ。

(function(p) {
  var s = '';
  with(Math) {
    while(s.length < p)
      s += floor(random() * pow(2, 32)).toString(36)
  }
  return s.slice(-1 * p);
})(16);

思いつきってのは、生成部分でfloor/random/powと、Mathメソッドの利用頻度が高いので「withでMath囲えば短くなるんじゃね?」ってとこだったんだけど、やってみたら3文字しか稼げてないし。まぁ可読性はいいような気がするんだけども。

36進数の生成は、以前capture.tumblr.jsの改造ときはMath.random()をnew Date().valueOf()で持ち上げてからピリオドを落とすやり方してたんだけど、今回は2^32で持ち上げた結果の実数部を切り捨てにしてみた。そのほかは、まぁシンプルですな。

もうちょっとだけ強度を上げてみる

これでも間に合わせにはいいかなと思うんだが、どうせならアルファベットは大文字小文字の混在にしたいな、と。で、やってみた。

展開すると、こんな感じ。
(function(p) {
  with(Math) {
    var s = '', r = random, f = floor, i;
    while(s.length < p)
      s += f(r() * pow(2, 32)).toString(36);
    s = s.slice(-1 * p).split('');
    for(i = 0;i < p;i++)
      if(f(r() * 10) % 2)
        s[i] = s[i].toUpperCase()
  }
  return s.join('')
})(16);

複数回出現するMathメソッド(floorとrandom)のエイリアスを作っちゃってるのでちょっと比較しづらいんだけど、手を入れた部分は
for(i = 0; i < p; i++)
の部分で、ここで1文字づつスキャンして、約50%の確率でtoUpperCase()による大文字変換をしてます。あと文字数短縮のためにvarを1回で済ませてたり。

実用性があるかはわからんのだが

これらのリンクをブックマーク登録しておけば、思い立ったときにランダムな文字列を生成できます。て、そうしょっちゅう需要があるものでもないんだろうけど。