質問

次のプロパティを持つオブジェクトがあります


GID
ID
コード
名前

一部のクライアントはコードを入力したくないので、最初の計画ではコードにIDを入力することでしたが、ormのベースオブジェクトは異なるため、私はねじ込まれています...

私の計画は####-####完全にランダムな値をコードに入れることでした。どうすればWindows 7のシリアルジェネレーター型のようなものを生成できますが、これでオーバーヘッドが発生しませんケース。

役に立ちましたか?

解決

ランダムな値、または一意の値が必要ですか?

random!= unique

randomは、同じ値を生成しない 確率、または同じ値を生成する再び確率を示すだけです。時間の経過とともに、以前の値を生成する可能性が高まり、ほぼ確実になります。どちらが必要ですか?

個人的には、何らかのコンテキストでGUIDを使用することをお勧めします[下記の最も簡単なセクションを参照]。状況に応じてオプションを選択できるように、他にもいくつかの提案を提供しました。


最も簡単

Codeが無制限の文字列(つまり、任意の長さ)である場合、一意のコードを生成するための最も簡単な半判読可能な方法は次のようになります

OrmObject ormObject= new OrmObject ();
string code = string.
    Format ("{0} [{1}]", ormObject.Name, Guid.NewGuid ()).
    Trim ();
// generates something like
// "My Product [DA9190E1-7FC6-49d6-9EA5-589BBE6E005E]"

識別可能な文字列を ormObject.Name に置き換えることができます。通常は typeof(objectInstance.GetType())。Name を使用しますが、OrmObjectが基本クラスである場合にのみ機能します。それがすべてに使用される具象クラスの場合すべてが同様のタグになります。ポイントは、次のようなユーザーコンテキストを追加することです。 wtfの記事-ユーザーは読むべき何かを持っています。


ランダム

1日か2日前に乱数生成について回答しました。コードやデータの品質を改善するためにジェネレーターの周りにシンプルで柔軟なフレームワークを構築するほどの生成数ではなく、これはソースの合理化に役立つはずです

それを読んだら、拡張メソッドを簡単に書くことができます。

public static class IRandomExtensions
{
    public static CodeType GetCode (this IRandom random)
    {
        // 1. get as many random bytes as required
        // 2. transform bytes into a 'Code'
        // 3. bob's your uncle
        ...
    }
}

    // elsewhere in code
    ...
    OrmObject ormObject = new OrmObject ();
    ormObject.Code = random.GetCode ();
    ...

実際に値を生成するには、 System.Security.Cryptography.RNGCryptoServiceProvider 実装で IRandom インターフェースを実装することをお勧めします。上記の実装は、Xランダムバイトのバッファーを生成し、必要な数だけ削除し、使い果たしたときにストリームを再生成します。

さらに-なぜ私が書き続けるのか分かりません。この問題は本当に魅力的だと思います! -CodeTypeが文字列で、読み取り可能なものが必要な場合は、上記のランダムなバイトを取得して、「一見」に変換できます。 Base64変換による読み取り可能な文字列

public static class IRandomExtensions
{
    // assuming 'CodeType' is in fact a string
    public static string GetCode (this IRandom random)
    {
        // 1. get as many random bytes as required
        byte[] randomBytes; // fill from random
        // 2. transform bytes into a 'Code'
        string randomBase64String = 
            System.Convert.ToBase64String (randomBytes).Trim ("=");
        // 3. bob's your uncle
        ...
    }
}

覚えておく

random!= unique

あなたの値は繰り返されます。最終的に。


ユニーク

問題について自問する必要のある質問がいくつかあります。

  1. すべての Code 値は一意でなければなりませんか? [そうでない場合、あなたは一生懸命やっています]
  2. Code とはどのタイプですか? [長さのある文字列の場合、完全なGUIDを使用]
  3. これは分散アプリケーションですか? [そうでない場合は、上記の@LBushkinが提案するDB値を使用してください]
  4. 分散アプリケーションの場合、クライアントアプリケーションはこれらのオブジェクトのインスタンスを生成および送信できますか? [もしそうなら、あなたはグローバルに一意の識別子が必要です、そして再びGUIDは確実な賭けです]

より多くの制約があると確信していますが、これは、自分のような問題に遭遇したときに実行する必要がある問い合わせの種類の例です。これらの質問から、一連の制約を思い付きます。これらの制約は設計に役立ちます。

これが役立つことを願って:)

ところで、問題に関する詳細(制約など)を投稿すると、より質の高いソリューションが提供されます。繰り返しますが、Typeは Code です。長さの制限はありますか?フォーマットの制約?文字の制約?

Arg、最後の編集、私は誓います。 Guidsを使用することになった場合、これを難読化するか、「圧縮」することもできます。それらをbase64でエンコードすることによる表現-上記の乱数のbase64変換に似ています。

他のヒント

次を使用してGUIDを生成できます:

Guid.NewGuid().ToString();

次のようになります:

  

788E94A0-C492-11DE-BFD4-FCE355D89593

データベースの自動番号列またはシーケンサを使用して、一意のコード番号を生成します。ほとんどすべての最新のデータベースは、何らかの形式で自動生成された数値をサポートしています。データベースがサポートするものを調べてください。

DBからのオートナンバー/シーケンサー値は一意であることが保証されており、比較的安価に取得できます。コードに割り当てられた完全に連続した番号を避けたい場合は、いくつかのシーケンサー値をパディングして連結できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top