我试图通过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)
首先,让我们重新陈述观察结果:当创建具有巨大时间延迟的连续GUID(600 亿纳秒)时,创建之间的结果GUID不是连续的.
我错过了什么吗?
你知道你需要知道的每一个事实,以弄清楚发生了什么.你只是不把它们放在一起.
您有一项服务可以提供Universe中所有计算机上的顺序和唯一的数字.想一想这是怎么可能的.这不是一个神奇的盒子; 有人必须写那段代码.
想象一下,如果您不必使用计算机来完成它,而是必须手动完成.您公布的服务:你提供连续的全球唯一号码给任何人谁问的任何时候.
现在,假设我问你三个这样的数字,你分发20,21和22.然后六十年后我再问你三个并且惊喜,你给我13510985,13510986和13510987."等一下这里"我说,"我想要六个连续数字,但是你给了我三个连续数字,然后又给了我三个.这给了什么?"
那么,你认为在那60年间发生了什么呢?请记住,您随时向任何询问者提供此服务.在什么情况下你能给我23,24和25? 只有在60年内没有人问过.
现在很明显为什么你的程序的行为完全符合它应该的样子?
实际上,顺序GUID生成器使用当前时间作为其策略的一部分来强制执行全局唯一属性.当前时间和当前位置是创建唯一号码的合理起点,因为可能在您的桌面上一次只有一台计算机.
现在,我告诫你,这只是一个起点; 假设你有20台虚拟机都在同一台真机上,并且都试图同时生成顺序GUID?在这些情况下,碰撞变得更加可能.您可以考虑在这些场景中可能用于缓解冲突的技术.