排序由UuidCreateSequential生成的顺序指南

Ahm*_*aid 3 c# guid

我试图通过UuidCreateSequential生成的GUID进行排序,但我看到的结果是不正确的,我在mising的东西吗?这是代码

    private 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 throw new Exception("could not generate unique sequential guid");
    }

    static void TestSortedSequentialGuid(int length)
    {
        Guid []guids = new Guid[length];
        int[] ids = new int[length];

        for (int i = 0; i < length; i++)
        {
            guids[i] = CreateSequentialGuid();
            ids[i] = i;
            Thread.Sleep(60000);
        }

        Array.Sort(guids, ids);

        for (int i = 0; i < length - 1; i++)
        {
            if (ids[i] > ids[i + 1])
            {
                Console.WriteLine("sorting using guids failed!");
                return;
            }
        }

        Console.WriteLine("sorting using guids succeeded!");
    }
Run Code Online (Sandbox Code Playgroud)

EDIT1:

只是为了让我的问题清楚,为什么使用默认的比较器不能对guid结构进行排序?

编辑2:这里还有一些我生成的顺序guid,似乎它们没有按十六进制字符串的形式递增排序

            "53cd98f2504a11e682838cdcd43024a7",
            "7178df9d504a11e682838cdcd43024a7",
            "800b5b69504a11e682838cdcd43024a7",
            "9796eb73504a11e682838cdcd43024a7",
            "c14c5778504a11e682838cdcd43024a7",
            "c14c5779504a11e682838cdcd43024a7",
            "d2324e9f504a11e682838cdcd43024a7",
            "d2324ea0504a11e682838cdcd43024a7",
            "da3d4460504a11e682838cdcd43024a7",
            "e149ff28504a11e682838cdcd43024a7",
            "f2309d56504a11e682838cdcd43024a7",
            "f2309d57504a11e682838cdcd43024a7",
            "fa901efd504a11e682838cdcd43024a7",
            "fa901efe504a11e682838cdcd43024a7",
            "036340af504b11e682838cdcd43024a7",
            "11768c0b504b11e682838cdcd43024a7",
            "2f57689d504b11e682838cdcd43024a7"
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

首先,让我们重新陈述观察结果:当创建具有巨大时间延迟的连续GUID(600 亿纳秒)时,创建之间的结果GUID不是连续的.

我错过了什么吗?

你知道你需要知道的每一个事实,以弄清楚发生了什么.你只是不把它们放在一起.

您有一项服务可以提供Universe中所有计算机上的顺序唯一的数字.想一想这是怎么可能的.这不是一个神奇的盒子; 有人必须写那段代码.

想象一下,如果您不必使用计算机来完成它,而是必须手动完成.您公布的服务:你提供连续的全球唯一号码任何人谁问的任何时候.

现在,假设我问你三个这样的数字,你分发20,21和22.然后六十年后我再问你三个并且惊喜,你给我13510985,13510986和13510987."等一下这里"我说,"我想要六个连续数字,但是你给了我三个连续数字,然后又给了我三个.这给了什么?"

那么,你认为在那60年间发生了什么呢?请记住,您随时向任何询问者提供此服务.在什么情况下你能给我23,24和25? 只有在60年内没有人问过.

现在很明显为什么你的程序的行为完全符合它应该的样子?

实际上,顺序GUID生成器使用当前时间作为其策略的一部分来强制执行全局唯一属性.当前时间和当前位置是创建唯一号码的合理起点,因为可能在您的桌面上一次只有一台计算机.

现在,我告诫你,这只是一个起点; 假设你有20台虚拟机都在同一台真机上,并且都试图同时生成顺序GUID?在这些情况下,碰撞变得更加可能.您可以考虑在这些场景中可能用于缓解冲突的技术.