生成的顺序GUID有时不是顺序的

时间:2017-01-27 17:11:13

标签: c# guid sequential newsequentialid

我有一个C#应用程序,它为我插入表中的每一行生成一个Sequential GUID。我希望插入的GUID是顺序的,但有时它们会破坏序列(以块为单位)。

示例:

Break in sequence

这些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:

2 个答案:

答案 0 :(得分:5)

我认为问题在于你假设“顺序”意味着“递增1”。虽然您的示例显示有时会发生这种情况但文档中没有实际保证。我们可以争论“序列”的定义,或者说这个函数可能命名很差甚至是错误但是在一天结束时,根据文档,它看起来完全按照定义100%工作:

  

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

对于那些对“顺序GUID”的一般概念有疑问的人,请使用“序列”的定义,即“遵循逻辑顺序”,并尝试并记住Melissa病毒。这是mildly document by this line

  

出于安全原因,修改了UuidCreate,以便它不再使用计算机的MAC地址来生成UUID。引入了UuidCreateSequential以允许使用机器以太网卡的MAC地址创建UUID。

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

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

答案 1 :(得分:1)

系统重启时NewSequentialId()重新开始。请参阅here

  

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

相关问题