【发布时间】:2016-07-22 21:59:50
【问题描述】:
我尝试对 UuidCreateSequential 生成的 Guid 进行排序,但我看到结果不正确,是我遗漏了什么吗?这是代码
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!");
}
编辑1:
为了澄清我的问题,为什么 guid 结构不能使用默认比较器排序?
编辑 2: 这里还有一些我生成的顺序 guid,似乎它们没有按照十六进制字符串的升序排序
"53cd98f2504a11e682838cdcd43024a7",
"7178df9d504a11e682838cdcd43024a7",
"800b5b69504a11e682838cdcd43024a7",
"9796eb73504a11e682838cdcd43024a7",
"c14c5778504a11e682838cdcd43024a7",
"c14c5779504a11e682838cdcd43024a7",
"d2324e9f504a11e682838cdcd43024a7",
"d2324ea0504a11e682838cdcd43024a7",
"da3d4460504a11e682838cdcd43024a7",
"e149ff28504a11e682838cdcd43024a7",
"f2309d56504a11e682838cdcd43024a7",
"f2309d57504a11e682838cdcd43024a7",
"fa901efd504a11e682838cdcd43024a7",
"fa901efe504a11e682838cdcd43024a7",
"036340af504b11e682838cdcd43024a7",
"11768c0b504b11e682838cdcd43024a7",
"2f57689d504b11e682838cdcd43024a7"
【问题讨论】:
-
运行您的精确样本,我能够在 x86 上生成顺序 guid。无法重现。请详细介绍系统设置
-
每次迭代都需要长时间睡眠,睡眠后,它们会被排序
-
不...取消你的睡眠。一切都还好。结果见here
-
对不起,我的意思是 sleep 它不起作用
-
有什么特殊的原因需要等待一分钟来生成一个 guid?我真的不愿意等待 10 分钟来重现它。但我认为,它不能以这种方式工作,因为序列可能会在这么长时间的休息时被打断