4

我有一个 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:

4

2 回答 2

5

我认为问题在于您假设“顺序”的意思是“递增一”。尽管您的示例表明有时会发生这种情况,但文档中并没有实际保证会发生这种情况。我们可以争论“序列”的定义,或者这个函数的命名可能很糟糕甚至是错误的,但归根结底,根据文档,它似乎 100% 完全按照定义工作:

创建一个大于此函数先前生成的任何 GUID 的 GUID

对于对“顺序 GUID”的一般概念有疑问的人,请使用关于“遵循逻辑顺序”的“顺序”定义,并尝试记住 Melissa 病毒。这条线温和地记录了这一点

出于安全原因,对 UuidCreate 进行了修改,使其不再使用机器的 MAC 地址来生成 UUID。引入 UuidCreateSequential 是为了允许使用机器以太网卡的 MAC 地址创建 UUID。

所以“序列”是基于 MAC 地址的 GUID。

回到 OP 的问题,我最好的猜测为什么你的 GUID 每次都不会增加一,这是一个简单的事实,你可能不是唯一一个调用这个函数的人。这是 Windows 的核心功能,必然会有其他组件、程序、服务等使用它。

于 2017-01-27T22:26:08.150 回答
2

系统NewSequentialId()重新启动时重新开始。见这里

创建一个 GUID,该 GUID 大于自 Windows 启动以来此函数先前在指定计算机上生成的任何 GUID。重新启动 Windows 后,GUID 可以从较低的范围再次启动,但仍然是全局唯一的。当 GUID 列用作行标识符时,使用 NEWSEQUENTIALID 可能比使用 NEWID 函数更快。这是因为 NEWID 函数会导致随机活动并使用较少的缓存数据页。使用 NEWSEQUENTIALID 还有助于完全填充数据和索引页。

于 2017-01-27T18:30:58.413 回答