2009-05-01 8 views
4

画像とそのサムネイルを保存するために自分のウェブサイトにランダムなフォルダ名を作成したいのですが、生成されたGUIDのフルバージョンを使用する代わりに、それの一部、おそらく最初の8文字とおそらくbase64でエンコードします。私は可能性のある衝突が心配です。ランダムなフォルダ名を作成する方法.NETで12文字長い

誰かが適切なアイデアであるかどうかについて正しい方向に向けることができますか?私は特定の文字数の下に名前を保持したい場合に使用できる代替ソリューションがありますか?

UPDATE:私はそれが生のGUIDを使用し、それが12文字長くないので、離れてpath.GetRandomFileNameから滞在しようとしています...

答えて

13

なぜこのようなものを使用して、競合することなくファイルを作成できるようになるまでループするのはなぜですか?

const string ValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

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を作成する典型的な問題(立て続けに呼ばれる重複を)避けるためです。

代わりに、1つの静的読み取り専用RNGを使用して、ロックによってGenerateNameの呼び出しをシリアライズすることもできます。

主なポイントは何とかあなたがランダムな名前を生成し、あなたが成功するまで、あなただけ与えられる12の文字[AZ 0-9](非常に迅速に発生する可能性がある、ランダムな名前のファイルを作成するために努力を続けるということです4,738,381,338,321,616,896の可能な組合せ)。

+1

RNG –

+1

+1の問題を+1し、店頭のクーポンコードを生成するためにこれを変更しました。私は単一のRNGを使用したいと思いますが、本当に必要なロックはありますか? Randomクラスはスレッドセーフではありませんか? – TheSoftwareJedi

+1

いいえ、ランダムはスレッドセーフではありません。私はあなたが複数のスレッドからそれを使用すると、永遠に繰り返される0のシードを持つ奇妙な状況に陥ることがあることを覚えているようです:( –

3

あなたはにSystem.IOにPathクラスを使用することができ、ランダムなファイル名とフォルダ名を生成します。

9

System.IO.Path.GetRandomFileName()

+0

この関数は、避けようとしているguidでフォルダ名を作成します。例えば ​​"dGhlIG1pbmQs"のような名前のフォルダを取得するには? – ak3nat0n

+0

いいえ、8.3の名前を返します。 8文字、ピリオド、3文字、すべて英数字。 – bsneeze

1

あなたがあなたのウェブサイトのためのデータベースを使用している場合は、画像のためのユニークなファイル名を生成するために自動インクリメント数またはシーケンスを使用することができます。

Oracleを使用すると、次のようなシーケンスが作成されます。

値CACHE値BY値 INCREMENTで始まる SEQUENCEのSEQUENCE_NAMEを MINVALUE値 MAXVALUE値を作成します。

シーケンスの次の値を取得するには、シーケンスの次の値を使用します。例えば、

CREATE SEQUENCE seq_user_id;

SELECT seq_user_id.NEXTVAL FROM dual; test_bed INTO

INSERT(USER_ID、CLASS_TYPE、room_location) VALUES(seq_user_id.NEXTVAL、 '水中Basketweaving'、 'RM1205')。

+0

どのようにその配列を生成しますか? – ak3nat0n

関連する問題