3

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


GIDID コード 名
_

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

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

4

3 に答える 3

3

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

ランダム!=一意

ランダムは、同じ値を生成しない確率、または同じ値を再度生成する確率を示すだけであることを忘れないでください。時間の経過とともに、以前の値を生成する可能性が高くなり、ほぼ確実になります。どちらが必要ですか?

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


最も簡単

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

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が基本クラスである場合にのみ機能します。これがすべてに使用される具象クラスである場合、それらはすべて同様のタグになります。重要なのは、@ Yuriy Faktorovichが参照している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 ();
    ...

実際に値を生成するには、実装をIRandom使用してインターフェースを実装することをお勧めしますSystem.Security.Cryptography.RNGCryptoServiceProvider。この実装は、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
        ...
    }
}

覚えて

ランダム!=一意

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


個性的

あなたがあなたの問題についてあなた自身に尋ねる必要がある多くの質問があります。

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

もっと制約があると思いますが、これは、自分のような問題が発生したときに実行する必要のある一連の問い合わせの例です。これらの質問から、一連の制約が思い浮かびます。これらの制約は、設計に影響を与えます。

お役に立てれば :)

ところで、問題に関する詳細[つまり制約]を投稿すると、より高品質のソリューションを受け取ることができます。繰り返しますが、タイプとは何Codeですか、長さの制約はありますか?フォーマットの制約?文字の制約?

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

public static class GuidExtensions
{
    public static string ToBase64String (this Guid id)
    {
        return System.Convert.
            ToBase64String (id.ToByteArray ()).
            Trim ("=");
    }
}

切り捨てとは異なり、base64変換は損失の多い変換ではありません。もちろん、上記のトリムは、base64の完全な拡張のコンテキストでは失われますが、単なるパディングであり、変換によって=導入された追加情報であり、元のGuidデータの一部ではありません。このbase64変換値からGuidに戻りたい場合は、base64文字列の長さが4の倍数になるまで、base64文字列を再埋め込みする必要があります。質問しないでください。興味がある場合はbase64を検索してください:)

于 2009-10-29T14:15:50.183 に答える
1

次を使用して Guid を生成できます。

Guid.NewGuid().ToString();

それはあなたに次のようなものを与えるでしょう:

788E94A0-C492-11DE-BFD4-FCE355D89593

于 2009-10-29T13:52:37.003 に答える
0

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

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

于 2009-10-29T14:06:04.463 に答える