我有一個C#應用程序,它爲插入到表中的每一行生成一個順序GUID。我期望插入的GUID是順序的,但有時他們打破序列(在塊)。生成的順序GUID有時不是連續的
實施例:
這些GUID中示出了它們所插入的順序。
爲什麼這些'連續的'GUID是通過這麼大的序列中斷創建的?
代碼用來生成連續的GUID:在一個循環中用於插入新的GUID和信息表
class NativeMethods
{
[DllImport("rpcrt4.dll", SetLastError = true)]
public static extern int UuidCreateSequential(out Guid guid);
}
public static Guid CreateSequentialGuid()
{
const int RPC_S_OK = 0;
Guid guid;
int result = NativeMethods.UuidCreateSequential(out guid);
if (result == RPC_S_OK)
return guid;
else
return Guid.NewGuid(); //<--In debugging, this statement never runs.
}
代碼:
Guid mySequentialGUID = CreateSequentialGuid();
string[] row = { item1,
item2,
item3,
sourceText,
encoding.ToString(),
mySequentialGUID.ToString()
};
var listViewItem = new ListViewItem(row);
myListView.Items.Add(listViewItem);
編輯: 請參閱此問題了解Sequential GUID:
- What are the performance improvement of Sequential Guid over standard Guid?
- Advantages and disadvantages of GUID/UUID database keys
一個GUID存在是一個唯一的編號。沒有更多,不少。雖然可以使用不同的算法來生成它們,但不應該依賴特定實現的特定屬性。不要再用GUID作爲GUID。如果你需要一個遞增的數字,那麼*得到一個數字並遞增它*,而不是使用一個GUID,它只是*生成*唯一*數字的一種表示方法。 – Servy
我從來沒有聽說過連續的GUID,但這似乎完全錯誤。你有這個嗎? GUID本質上是獨一無二的,你無法控制它是如何產生的。如果你知道將要生成的下一個GUID是什麼(因爲它與你的最後一個GUID是相鄰的),那麼它不是唯一的,因爲其他人可以以相同的起始值開始做同樣的事情。 –
@ rory.ap我沒有組成一個連續的GUID。甚至有一種內置方法可以在Transact-SQL中創建順序GUIDS,稱爲NewSequentialID()。 https://msdn.microsoft.com/en-us/library/ms189786.aspx –