2009-04-13 19 views
3

GUIDを使用せずに一意のIDを生成するためのアイデアをいくつか得たいと思います。私は、一意の値がint32型であることをお勧めします。一意のIDを生成する式はありますか?

私は、データベースプライマリキーにもURLにも使える何かを探しています。

これらはユニークと考えることができますか?

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

他のアイデア?

おかげ

EDIT:まあ、私はドメイン駆動設計とすべての私のエンティティを練習しようとしています有効にするには、作成時にIDを持っている必要があります。私は理論的には自動増分された数値を得るためにDBを呼び出すことができましたが、DB関連のものがドメインに入っているので、これをはっきりと操ることができます。

+0

なぜそれがグローバルにユニークである必要があるのか​​は分かりませんが、もしあなたがそうしたら、32ビットで十分ではないと思います。 – Gleb

答えて

4

それはあなたがどれくらいユニークである必要があり、IDを与える必要があるアイテム数によって異なります。あなたの最善の策は、それらを順番に割り当てることです。あなたが想像してみようとすると、誕生日パラドックス(あなたの予想よりも衝突が多い可能性が高い)または(あなたのケース1のように)実行される可能性があります。

上記の1)はほとんどの場合、2)より少し良いです。それはレート制限されています - 1票につき1つ以上のIDを発行することはできませんが、Birthday Paradoxの影響を受けません。あなたの2)ちょうど離れてビットを投げている。乱数を使ったXORよりも若干良いかもしれませんが、いずれにしても、ランドがあなたに何かを買っているとは思っていません。問題を隠すだけで修正するのが難しくなります。

+0

"料金は限られています - ティックごとに1つ以上のIDを発行することはできません" - 実際はありません。それはシステムクロックの精度に依存します。 – Joe

+0

私は逐次ルートに行きます。 –

+0

@Joe - あなたがレートが低いかもしれないことを意味するなら(クロックは "ダニ"をスキップする)確かに。しかしそれはより高いことはできないので、それはティックレートによって制限されます。 – MarkusQ

1

を使用している場合は、RNGCryptoServiceProviderクラスを使用することができ、これらみなさグローバル一意ていますか?

1)(int型)DateTime.Now.Ticks 2) (INT)DateTime.Now *乱数

どちらのオプションがグローバルに一意です。

オプション1 - これは、ティックごとに複数のIDが生成されることを保証できない場合にのみユニークです。あなたの説明から、これはうまくいくようには聞こえません。

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

グローバルに一意のIDがint32の場合は、ある種の同期サービス順次IDを返します。私はそれがあなたのグローバルな意味の定義に依存すると思います。あなたがint32以上の規模で作業していて、特定のネットワーク上でグローバルを意味するならば、シーケンス番号が付加されたIPアドレスを使用できます。シーケンス番号はプロセス間で同期して生成されます。

IPアドレス以外の固有の識別子がある場合は、明らかにURLの一部として表示する方が良いでしょう。

関連する問題