【发布时间】:2017-06-13 10:58:00
【问题描述】:
我有一个 C# 应用程序,它为我插入到表中的每一行生成一个顺序 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 和信息插入表中的代码:
Guid mySequentialGUID = CreateSequentialGuid();
string[] row = { item1,
item2,
item3,
sourceText,
encoding.ToString(),
mySequentialGUID.ToString()
};
var listViewItem = new ListViewItem(row);
myListView.Items.Add(listViewItem);
编辑: 请参阅此问题以了解顺序 GUID:
【问题讨论】:
-
一个 GUID 存在是一个唯一的数字。不多也不少。虽然可以使用不同的算法来生成它们,但您不应依赖特定实现的特定属性。将
GUID视为 GUID,不再赘述。如果您需要一个递增的数字,则获取一个数字并递增它,而不是使用 GUID,它仅表示一种生成唯一的方式i> 数字。 -
我从未听说过顺序 GUID,但这似乎完全错误。这是你编的吗? GUID 就其本质而言是独一无二的,您无法控制它的生成方式。如果您知道将生成的下一个 GUID 是什么(因为它是您最后一个 GUID 的下一个),那么它不是唯一的,因为其他人可以从相同的起始值开始做同样的事情.
-
为什么重要?只要它们仍然有序,它仍然可以工作,并且不必重新排序索引。并不是说它们会耗尽价值:)
-
看来sequential guids 使用系统时间,所以我可以看到时钟更新时(大约每 15 毫秒)会有跳跃。
-
IMO,顺序并不意味着连续。
标签: c# guid sequential newsequentialid