2015/02/25

[C#]パスワードのためのアルファベットと数字混在のランダムな文字列の生成する

このエントリーをはてなブックマークに追加
パスワード生成とかに使われそうな感じのやつです。
IWg7G9mN←こういうのが出力できるとOK。

最初はランダムに数字を取得して文字コードから文字列を取得したらいいかなと考えましたが、単に候補文字をざっと準備しておいてランダムに選ぶほうが明瞭ですね。
アルファベット、数字だけじゃなくて、ひらがなカタカナ、漢字混在で作るにしても候補文字を準備しとくほうが簡単そうです。

文字の配列要素を用意しとく

候補文字を並べて準備しておいて、単純にランダムに選ぶというコードです。
非効率ではあるけれど、あきらかにメンテナンスもしやすいし汎用性もありそう。

private static string STR_GROUP_NUMBER = "0123456789";
private static string STR_GROUP_ALPHABET_LARGE = "ABCDEFGHIJKLNMOPQRSTUVWXYZ";
private static string STR_GROUP_ALPHABET_SMALL = "abcdefghijklnmopqrstuvwxyz";

private static Random _r = null;

// 引数(count)は出力文字の桁数です
public static string RandomString(int count) {
    if (_r == null) {
        _r = new Random();
    }
    string group = STR_GROUP_NUMBER 
        + STR_GROUP_ALPHABET_LARGE 
        + STR_GROUP_ALPHABET_SMALL;
        
    char[] list = new char[count];
    for (int i = 0; i < count; i++) {
        int num = _r.Next(0, group.Length); // ランダムに0~nの数値を返す
        list[i] = group[num];
    }
    return new string(list);
}
数字を出さないようにするためにはSTR_GROUP_NUMBERを除外すればいいだけ。
あるいは記号を追加するのも、文字列を足せばいいだけですね。

Randomクラスはインスタンス生成時の時刻から任意の乱数が選ばれます。
インスタンスを毎時生成すると、間髪入れず連続で呼び出したときは乱数が被ってしまうので、それを回避するために一回生成したものを使いまわすようにしています。

出力結果

桁数8桁のランダム文字を出力してみます。

for (int i = 0; i < 10;i++) {
    Console.WriteLine(RandomString(8));
}

IWg7G9mN
WxHPMkPP
qTu9oblq
WDKokf1J
19mw9TSh
MQlw0cIZ
IjttEtHh
kpa2ozbq
wyMExSGN
1DlMppqu

ばっちりです。

0 件のコメント :

コメントを投稿