重複の可能性:
シーケンシャルGUIDジェネレーターC#
レイヴンに保管されている可能性のある文書を入手しました。それらのシーケンシャルGUIDを生成したいと思います(RavenDB.netで、ravenがそれらを使用していることを確認しました)。
IDを生成するために使用できるravendbAPIはありますか?
質問はRavenDB固有であることに注意してください
重複の可能性:
シーケンシャルGUIDジェネレーターC#
レイヴンに保管されている可能性のある文書を入手しました。それらのシーケンシャルGUIDを生成したいと思います(RavenDB.netで、ravenがそれらを使用していることを確認しました)。
IDを生成するために使用できるravendbAPIはありますか?
質問はRavenDB固有であることに注意してください
以下のコードは、eTags のサーバーで RavenDB がこれをどのように実現するかを示しています。コンテキストはこちらで確認できます。コードの他の部分はここにあります
public Guid CreateSequentialUuid()
{
var ticksAsBytes = BitConverter.GetBytes(currentEtagBase);
Array.Reverse(ticksAsBytes);
var increment = Interlocked.Increment(ref sequentialUuidCounter);
var currentAsBytes = BitConverter.GetBytes(increment);
Array.Reverse(currentAsBytes);
var bytes = new byte[16];
Array.Copy(ticksAsBytes, 0, bytes, 0, ticksAsBytes.Length);
Array.Copy(currentAsBytes, 0, bytes, 8, currentAsBytes.Length);
return bytes.TransfromToGuidWithProperSorting();
}
これは内部の詳細であるため、API 経由でアクセスできるとは思いませんが、似たようなものを自分で実装できます。currentEtagBase
基本的には、グローバル カウンター (および)を持つことに依存していsequentialUuidCounter
ます。
通常、GUID値を使用している場合は、それらが連続していることを心配する必要はありません。
Guid.NewGuid
直接使用できる一意の値を提供します。
本当にシーケンシャル値が必要な場合は、整数型を受け入れるGuidコンストラクターを使用して、シーケンシャルに増加する値を作成できます。ただし、これは非常に珍しいことです。
これは通常の要求ではありません。定義上、シーケンシャル を作成することは(可能な限り)一意であり、数学的に予測可能なシーケンスが存在すると、一意性のサポートに追加の問題が発生します。GUID
GUID
しかし、ちなみに、いつものように、これについてはすでに考えている人が常にいます。
このリンクの男も同じ問題を抱えていたようです:
注:提供されているコードはのためのものですC# 2005
が、少なくともこの質問に関しては、それ以降あまり変更されていません。
編集
ドキュメントによると、順次GUID生成に関して:
数値またはGUIDIDプロパティがサポートされており、シームレスに機能します。この場合、RavenDBは、内部文字列IDを、エンティティに表示されている数値またはGUID値に自動的に変換します。
このアプローチを使用すると、オブジェクトでStoreを呼び出した直後にIDを使用できます。RavenDBセッションは、サーブからIDを要求せずに、メモリに一意のIDを設定します。
つまり、「サーバー」によって生成され、メモリにも保存されている場合でも、これが心配な場合は、ほとんど費用がかからないように依頼してください...