2012-09-03 42 views
1

可能重複的GUID順序:
Sequential Guid Generator C#生成由我自己

我這可能存儲在烏鴉的文件。我想爲它們生成一個連續的GUID(我在RavenDB.net上看到烏鴉使用它們)。

有沒有可用於生成id的ravendb API?

注意的問題是RavenDB具體

+2

根據定義,GUID不是連續的。 – Dennis

+1

@ChrisGessler:不重複。我詢問了*** RavenDb:s ***的實現 – jgauffin

+0

@jgauffin:你想在數據庫端生成,根據[Ayende](https://groups.google.com/forum/?fromgroups#! topic/ravendb/5awuv842u38)後,足夠設置'idColumn = null'? – Tigran

回答

3

下面的代碼顯示瞭如何RavenDB達到這個在服務器上的eTags,你可以請參閱上下文here。另一塊代碼是here

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訪問,因爲它是一個內部的細節,但你可以實現類似的東西自己。基本上它依靠有一個全球計數器(currentEtagBasesequentialUuidCounter)。

0

通常情況下,如果你使用GUID值,你就不會擔心他們是順序

Guid.NewGuid將爲您提供可直接使用的獨特值。

如果您確實需要連續值,則可以使用接受整數類型的Guid constructor,並構建按順序遞增的值。然而,這將非常不尋常。

+2

連續部分的全局唯一標識符並不新鮮。它們存在於例如SqlServer中,並且加速查找 – jgauffin

+0

@jgauffin是的,但是它們通常在插入時自動生成。手動創建新的順序值並不常見。 –

+0

這就是爲什麼我問。我想能夠使用ravendbs實現 – jgauffin

0

這不是通常的要求:創建一個順序GUID,因爲根據定義,GUID是唯一的(就像它可能)和一些數學,預見序列將介紹其獨特性支持的其他問題的存在。

但是,順便一提,總是有人想到這個已經。

看來,這個鏈接的人有同樣的問題:

Generate Sequential GUID

注:所提供的代碼是C# 2005,卻自認爲沒有太大的改變,至少在這個問題的重視。

編輯

根據文件,在連續的GUID生成的方面:

數字或GUID標識屬性支持,並無縫地工作。 在這種情況下,RavenDB會自動將 之間的內部字符串ID轉換爲實體 中顯示的數字或Guid值並返回。

使用這種方法,ID是可調用對象的商店 之後 - 在RavenDB會議將設置在內存 一個唯一的ID沒有要求一個從服務

這意味着,即使它通過產生「服務器」,它也存儲在內存中,所以要求它將幾乎沒有成本,如果這是你的warry ...