3

GUIDを使用せずに一意のIDを生成するためのいくつかのアイデアを取得したいと思います。できれば、一意の値をint32型にすることをお勧めします。

データベースの主キーに使用できるだけでなく、URLに対応できるものを探しています。

これらはユニークと見なすことができますか?

  1. (int)DateTime.Now.Ticks
  2. (int)DateTime.Now * RandomNumber

他のアイデアはありますか?

ありがとう

編集:私はドメイン駆動設計を実践しようとしていますが、すべてのエンティティは作成時に有効であるためにIDを持っている必要があります。理論的には、DBを呼び出して自動インクリメントされた番号を取得することもできますが、DB関連のものがドメインに入ってくるので、これを避けたいと思います。

4

3 に答える 3

4

それは、必要な一意性と、ID を付与する必要があるアイテムの数によって異なります。最善の策は、それらを順番に割り当てることです。派手になろうとすると、誕生日のパラドックスに遭遇する可能性があります(衝突は予想よりも可能性が高いです)または(上記のケース1のように)それらを発行できるレートを制限することを余儀なくされます。

ほとんどの場合、上記の 1) は 2) よりも少し優れています。レートが制限されています-ティックごとに 1 つ以上の ID を発行することはできません-しかし、誕生日のパラドックスの影響を受けません。あなたの2)はビットを捨てているだけです。乱数でXORする方が少し良いかもしれませんが、いずれにせよ、ランドがあなたに何かを買っているとは思いません。問題を隠して修正を難しくしているだけです。

于 2009-04-13T14:39:42.503 に答える
1

これらはグローバルに一意と見なされますか?

1) (int)DateTime.Now.Ticks 2) (int)DateTime.Now * RandomNumber

どちらのオプションもグローバルに一意ではありません。

オプション 1 - これは、ティックごとに生成される ID が 1 つだけであることを保証できる場合にのみ一意です。あなたの説明からすると、これが機能するようには思えません。

オプション 2 - 乱数は疑似乱数ですが、一意であるとは限りません。すでに念頭に置いて、このオプションの DateTime 部分をオプション 1 と同様の問題に減らすことができます。

int32 であるグローバルに一意の ID が必要な場合、1 つの良い方法は、連続した ID を返すある種の同期サービスです。グローバルの定義が何を意味するかによると思います。使用する int32 よりも大きく、特定のネットワークでグローバルを意味する場合は、シーケンス番号が追加された IP アドレスを使用できます。シーケンス番号はプロセス間で同期的に生成されます。

IP アドレス以外の一意の識別子がある場合は、明らかに URL の一部として表示する方が適切です。

于 2009-04-13T15:18:01.977 に答える
0

.NET を使用している場合は、RNGCryptoServiceProvider クラスを使用できます。

RNGCryptoServiceProvider クラス

于 2009-04-13T14:40:57.213 に答える