1

重複の可能性:
シーケンシャルGUIDジェネレーターC#

レイヴンに保管されている可能性のある文書を入手しました。それらのシーケンシャルGUIDを生成したいと思います(RavenDB.netで、ravenがそれらを使用していることを確認しました)。

IDを生成するために使用できるravendbAPIはありますか?

質問はRavenDB固有であることに注意してください

4

3 に答える 3

3

以下のコードは、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ます。

于 2012-09-04T09:30:57.643 に答える
0

通常、GUID値を使用している場合は、それらが連続していることを心配する必要はありません。

Guid.NewGuid直接使用できる一意の値を提供します。

本当にシーケンシャル値が必要な場合は、整数型を受け入れるGuidコンストラクターを使用して、シーケンシャルに増加する値を作成できます。ただし、これは非常に珍しいことです。

于 2012-09-03T18:28:18.713 に答える
0

これは通常の要求ではありません。定義上、シーケンシャル を作成することは(可能な限り)一意であり、数学的に予測可能なシーケンスが存在すると、一意性のサポートに追加の問題が発生します。GUIDGUID

しかし、ちなみに、いつものように、これについてはすでに考えている人が常にいます。

このリンクの男も同じ問題を抱えていたようです:

シーケンシャルGUIDを生成する

注:提供されているコードはのためのものですC# 2005が、少なくともこの質問に関しては、それ以降あまり変更されていません。

編集

ドキュメントによると、順次GUID生成に関して:

数値またはGUIDIDプロパティがサポートされており、シームレスに機能します。この場合、RavenDBは、内部文字列IDを、エンティティに表示されている数値またはGUID値に自動的に変換します。

このアプローチを使用すると、オブジェクトでStoreを呼び出した直後にIDを使用できます。RavenDBセッションは、サーブからIDを要求せずに、メモリに一意のIDを設定します。

つまり、「サーバー」によって生成され、メモリにも保存されている場合でも、これが心配な場合は、ほとんど費用がかからないように依頼してください...

于 2012-09-03T18:30:37.003 に答える