gpt4 book ai didi

c# - GUID比较怪异

转载 作者:太空狗 更新时间:2023-10-30 01:18:17 25 4
gpt4 key购买 nike

.NET 有两种 GUID 数据类型:Guid ,以“自然”方式对 GUID 进行排序,以及 SqlGuid ,它认为最后一个破折号后的六个字节最重要。此处详细解释了这种差异:MSDN: Comparing GUID and uniqueidentifier Values .

然而,在这两种情况下,以下内容应该成立(假设所有 ... 都相等):

57d0affe-... < 57d0afff-... < 57d0b000-...

如果是这样,为什么我会得到以下输出(见评论)?

using System;
using System.Data.SqlTypes;

class Program
{
static void Main(string[] args)
{
var g1 = new SqlGuid("57d0affe-9d9d-11e4-bec2-e840f2ad1632");
var g2 = new SqlGuid("57d0afff-9d9d-11e4-bec2-e840f2ad1632");
var g3 = new SqlGuid("57d0b000-9d9d-11e4-bec2-e840f2ad1632");

Console.WriteLine(g1 < g2); // prints True
Console.WriteLine(g2 < g3); // prints False <- ?
Console.ReadLine();
}
}

据我了解g2 < g3也应该产生 True 。我是不是误解了什么,或者这是框架中的一些错误?使用普通 Guid 时而不是 SqlGuid , 输出两次 True , 正如预期的那样。

最佳答案

比较有点复杂。

首先定义了一些顺序:

  private static readonly int[] x_rgiGuidOrder = new int[16]
{10, 11, 12, 13, 14, 15, 8, 9, 6, 7, 4, 5, 0, 1, 2, 3};

还有这个方法

private static EComparison Compare(SqlGuid x, SqlGuid y) {
//Swap to the correct order to be compared
for (int i = 0; i < SizeOfGuid; i++) {
byte b1, b2;

b1 = x.m_value [x_rgiGuidOrder[i]];
b2 = y.m_value [x_rgiGuidOrder[i]];
if (b1 != b2)
return(b1 < b2) ? EComparison.LT : EComparison.GT;
}
return EComparison.EQ;
}

但这还不是全部,真正的原因是字符串的构造函数:

    public SqlGuid(String s) {
m_value = (new Guid(s)).ToByteArray();
}

它创建一个新的 GUID,然后使用它的字节表示。

这为我们提供了以下字节值:

g2 : 255 175 208 87 157 157 228 17 190 194 232 64 242 173 22 50
g3 : 0 176 208 87 157 157 228 17 190 194 232 64 242 173 22 50

我们可以看到 255 大于 0 而不是相反。

您可以找到完整的来源 here fiddle 如何获得字节表示是here

关于c# - GUID比较怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com