1

私のアプリケーションでは 9 桁の数字を使用しています (英数字でもかまいません)。任意の数字から始めて、最初にインクリメントすることができます。しかし、私のアプリケーションは単一インスタンス アプリケーションではないため、これexeを別のインスタンスとして実行すると、最新の値がインクリメントされ、前のインスタンスはその値が必要なときに最新の値を再度インクリメントする必要があります。つまり、値は、開いているすべてのインスタンスの中で常に増分された最新の値である必要があります。

これで問題は半分です。反対側は、exes はネットワーク上の任意のマシンで実行でき、各インスタンスはさらに 2 年間増加し続ける必要があります (時間が戻らないのと同じように)。私の制限は、ファイルを使用して最新の値を共通の場所に保存および取得できないことです。

どうやってやるの?

9文字/桁のUNIQUE NUMBERも確実に機能します。全体のアイデアは、各「機密ファイル」に番号(9文字の長さの文字列)を割り当て、(それを暗号化することです。これは私の仕事ではありません)

私は試しました:

  1. 合計 128 ビットで一意であるが、最後の 9 文字または最初の 9 文字ではない GUID
  2. ティック数が 9 以上
  3. 12 文字の場合にのみ一意の MAC アドレス
  4. ISBN(ブックナンバリングシステム)

等々 ...

4

3 に答える 3

2

最善のアプローチは、アプリケーションの各インスタンスがネットワーク経由でクエリを実行して一意の番号を取得する一意の番号サーバーを用意することだと思います。

于 2012-06-30T02:57:52.883 に答える
1

まず、問題から分散された側面を取り除く必要があります。ユーザー Hugo が提案したように、IP アドレスの最後の 2 バイトまたは 3 バイトを使用すると機能するはずです。あなたの問題は、単一のマシンごとのローカルの問題に縮小されました。

あなたのアルゴリズムはおそらく再起動を処理できる必要があり、再起動後に同じ番号を配布し始めないようにする必要があります。ファイルシステムを介してこのメ​​カニズムに関する情報を保存および取得するためにファイルを使用するオプションはないと述べています。これは、乱数ジェネレーターだけでは不十分であり、乱数ジェネレーターにも時間ベースのコンポーネントが必要であることを意味します。ある日付から経過した秒数を含む 4 バイトを使用すると、100 年以上の一意性が得られます。ただし、理想的には、ここで使用するタイム スケールは、予想される数字の配布頻度によって異なります。あなたの問題は、1 秒ごとに 1 台のマシンごとのローカルな問題に縮小されます。

最後の 2 または 3 バイトは、2 番目のローカルの一意性を確保するために使用できます。要件とオペレーティング システムに応じて、パイプ、ソケット、共有メモリなど、これを管理する複数の IPC メカニズムがあります。または、より創造的な方法を考えることができます。ノードに参加しているプロセスの数がわかっている場合は、起動時または構成時に各プロセスにシーケンス番号を割り当てることができ、2 バイトまたは 3 バイトのうちの 1 バイトがそのために使用されます。一意性の問題は、プロセスに対してわずか 1 秒でローカルになりました。これは実行可能なはずです。

于 2012-06-30T13:20:15.027 に答える
0

なぜ正確に9でなければならないのですか?それがあなたを制限しなければ、UUIDは素晴らしいでしょう。

いずれにせよ、最善の方法は、乱数を生成することです。すべての PC が同じネットワーク内にある場合は、衝突を避けるために、最初に IP アドレスのホスト番号を使用します。とにかく、ほとんどの場合、これは 16 ビットまたは 24 ビットを超えてはならないので、残りの 6 桁があります。

于 2012-06-30T02:50:22.920 に答える