.NETで12文字のランダムなフォルダ名を作成する方法
-
03-07-2019 - |
質問
画像とサムネイルを保存するためにウェブサイトにランダムなフォルダー名を作成したいのですが、生成されたGUIDのフルバージョンを使用する代わりに、その一部のみ、おそらく最初の8文字とおそらくbase64でエンコードします。しかし、衝突の可能性が心配です。
十分なアイデアであるかどうかについて、誰かが私を正しい方向に向けることができますか?名前を一定の文字数未満にしたい場合に使用できる代替ソリューションはありますか?
更新:生のGUIDを使用し、長さが12文字ではないため、path.GetRandomFileNameから離れようとしています...
解決
なぜこのようなものを使用するだけでなく、競合することなくファイルを作成できるようになるまでループしますか?
const string ValidChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static string GenerateName(Random random, int length)
{
char[] chars = new char[length];
for (int i=0; i < length; i++)
{
chars[i] = ValidChars[random.Next(ValidChars.Length)];
}
return new string(chars);
}
RNGを渡す理由は、静的なRNG(スレッドセーフではない)を使用せずに、メソッドで新しいRNGを作成するという一般的な問題(連続して呼び出されると重複する)を回避するためです。
別の方法は、単一の静的読み取り専用RNGを使用し、ロックによって GenerateName
内で呼び出しをシリアル化することです。
主なポイントは、なんとかランダムな名前を生成し、成功するまでランダムな名前のファイルを作成しようとすることです。これは非常に迅速に発生する可能性があります(12文字[AZ 0 -9] 4,738,381,338,321,616,896の可能な組み合わせを示します。
他のヒント
System.IO.Path.GetRandomFileName()
System.IOのPathクラスを使用して、とりわけ、ランダムなファイル名とフォルダー名を生成できます。
Webサイトにデータベースを使用している場合、自動インクリメント番号またはシーケンスを使用して、画像の一意のファイル名を生成できます。
Oracleを使用すると、次のようにシーケンスを作成できます。
シーケンスの作成sequence_name MINVALUE値 MAXVALUE値 値で始める 値による増分 CACHE値;
シーケンスの次の値を取得するには、シーケンスのnextvalを使用します。例
シーケンスの作成seq_user_id;
SELECT seq_user_id.NEXTVAL FROM dual;
test_bedに挿入(user_id、class_type、room_location) VALUES(seq_user_id.NEXTVAL、「Underwater Basketweaving」、「RM1205」);