1

私のクライアントの 1 人が、自分のアイテムに一意のコードを使用したいと考えており (長い話です..)、彼は私に解決策を求めてきました。コードは 4 つの部分で構成され、最初の部分は商品の発送元の郵便番号、2 番目の部分はサプライヤー登録番号、3 番目の数字は商品が発送された年、最後の部分は 3 つの数字です。部門の英数字の一意の文字。

ご覧のとおり、最初の 3 つの部分は静的フィールドであり、同じ送信者が同じ年に変更されることはありません。したがって、最後の部分はその年の識別子部分であると言えます。この部分は 3 分割の英数字で、000 から始まり ZZZ で終わることを意味します。

問題は、私のクライアントが、いくつかの合理的な理由で、この部分をシーケンシャルにしないことを望んでいることです。たとえば、これは彼が望んでいるものではありません。

06450-05-2012-000

06450-05-2012-001

06450-05-2012-002

...

06450-05-2012-ZZY

06450-05-2012-ZZZ

最後の部分は、次のようにランダムに生成されます。

06450-05-2012-A17

06450-05-2012-0BF

06450-05-2012-002

...

06450-05-2012-T7W

06450-05-2012-22C

しかし、それはまた非反復的であるべきです。したがって、可能な ID が生成されたら、その可能性は選択プールから破棄する必要があります。

これを行うための効果的な方法を探しています。

  1. 選択した可能性のみを記録し、それらに対して新しく作成された可能性をチェックすると、特に最後近くで、既に選択済みのものを作成し続けるという最悪のケースの可能性が常にあります.
  2. 一度にすべての可能性を作成してテーブルまたはファイルに記録すると、選択されていないレコードを検索するため、アイテムを作成するたびに時間がかかる場合があります。ちなみに26文字+10桁は46.656通りの組み合わせで、4等分を足すと1.679.616通りの組み合わせになる可能性があります。

あなたが提案できるより効果的な方法はありますか?コーディングには C# を使用し、データベースには MS SQL を使用します。

4

3 に答える 3

4

ランダムである必要がない場合は、互いに素である固定されているが「予測不可能な」加数を選択することができます26 + 10 == 36 == 2²·3²。つまり、どちら2でも除算できない固定加数を選択するだけ3です。

その後、新しいシリアル番号が必要になるたびに、この固定番号を以前のシリアル番号に追加し続けます。もちろん、これはモジュロ46656(または1679616)で実行されます。

数学は、同じ番号を2回取得しないことを保証します(「無料の」番号がなくなる前に)。

加数として、モジュロなconst int addend = 26075ので使用できます。56

于 2012-12-30T22:30:35.773 に答える
4

36^3各 zip-supplier-year タプルに対して作成するエントリがはるかに少ないと予想される場合は、最後のフィールドにランダムな値を選択して、存在するかどうかを確認し、存在する場合は繰り返す必要があります。

可能なエントリの最大数の半分を作成した場合でも、新しいエントリの期待値は 1 回の失敗のみです。データベースが全体的な識別子に基づいてインデックス化されていると仮定すると、これはそれほど大きな代償ではありません。

とはいえ、考えられるいくつかの識別子を除いてすべてを使用することが予想される場合は、考えられるすべてのレコードを事前に作成する必要があります。高コストのように聞こえるかもしれませんが、未使用のレコードを格納するメモリ内の各スペースには、最終的に実際のレコードが格納されます。

最初の状況の方が可能性が高いと思いますが、そうでない場合、または2つの他の組み合わせがある場合は、さらに情報をコメントに追加してください。回答を修正します.

于 2012-12-30T22:08:05.920 に答える
4

オプションは、使用するコードの量に依存すると思います。

  1. それらのほとんどを 1 年以内に使用することが予想される場合は、事前に生成することをお勧めします。正しく行われれば、ルックアップは非常に高速になるはずです。いずれにせよ、DB には年間 1.679.616 個のアイテムが存在することになるため、そのようなことを正しく行う必要があります。

    一方で、それらのほとんどを使用することを期待しているのは良いことですか? 予想よりもアイテムが突然増えた場合、コードが表示されないことがあります。

  2. 少量しか使用しないと予想される場合は、ランダム + 存在チェックを使用することをお勧めします。

于 2012-12-30T22:08:23.070 に答える