gpt4 book ai didi

c# - 如何测试 C# Sql server 顺序 GUID 生成器?

转载 作者:行者123 更新时间:2023-11-30 18:38:28 24 4
gpt4 key购买 nike

有许多关于如何创建 Sql 服务器索引友好的 Guid 的操作方法,例如 this教程。另一种流行的方法是来自 NHibernate 实现的方法(在下面列出)。所以我认为编写一个实际测试此类代码的顺序要求的测试方法可能会很有趣。但我失败了——我不知道什么是好的 Sql 服务器序列。我不知道他们是如何订购的。

例如,给定两种创建顺序 guid 的不同方法,如何确定哪种方法最好(速度除外)?例如,看起来两者都有缺点,如果他们的时钟设置为 2 分钟(例如时间服务器更新),他们的序列会突然中断?但这是否也意味着 Sql server 索引的麻烦?

我使用此代码生成顺序 Guid:

public static Guid CombFromArticle()
{
var randomBytes = Guid.NewGuid().ToByteArray();
byte[] timestampBytes = BitConverter.GetBytes(DateTime.Now.Ticks / 10000L);

if (BitConverter.IsLittleEndian)
Array.Reverse(timestampBytes);

var guidBytes = new byte[16];

Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 10);
Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6);

return new Guid(guidBytes);
}

public static Guid CombFromNHibernate()
{
var destinationArray = Guid.NewGuid().ToByteArray();
var time = new DateTime(0x76c, 1, 1);
var now = DateTime.Now;
var span = new TimeSpan(now.Ticks - time.Ticks);
var timeOfDay = now.TimeOfDay;
var bytes = BitConverter.GetBytes(span.Days);
var array = BitConverter.GetBytes((long)(timeOfDay.TotalMilliseconds / 3.333333));
Array.Reverse(bytes);
Array.Reverse(array);
Array.Copy(bytes, bytes.Length - 2, destinationArray, destinationArray.Length - 6, 2);
Array.Copy(array, array.Length - 4, destinationArray, destinationArray.Length - 4, 4);
return new Guid(destinationArray);
}

文章中的那个稍微快一点,但哪个为 SQL Server 创建了最佳序列?我可以填充 100 万条记录并比较碎片,但我什至不确定如何正确验证它。无论如何,我想了解如何编写一个测试用例来确保序列是由 Sql server 定义的序列!

我还想对这两个实现发表一些评论。是什么让一个比另一个更好?

最佳答案

我为 SQL Server 生成了顺序 GUID。之前我从来没有看过太多的文章。不过,看起来还是不错的。

第一个,我用一个系统函数生成(以获得一个合适的函数),接下来的,我只是递增。当然,您必须寻找溢出之类的东西(另外,一个 GUID 有多个字段)。

除此之外,没有什么难以考虑的。如果 2 个 GUID 是唯一的,那么它们的序列也是唯一的,如果......你保持在几百万以下。好吧,这是数学问题。即使是 2 个 GUID 也不能保证是唯一的,至少从长远来看(如果人类不断发展)。因此,通过使用这种序列,您可能会将碰撞的概率从接近 0 增加到接近 0(但略多)。如果有的话..问数学家..这是生日问题http://en.wikipedia.org/wiki/Birthday_problem ,有疯狂的天数。

它是用 C 语言编写的,但应该很容易翻译成更舒适的语言。特别是,您不必担心将 wchar 转换为 char。

GUID guid;
bool bGuidInitialized = false;
void incrGUID()
{
for (int i = 7; i >= 0; --i)
{
++guid.Data4[i];
if (guid.Data4[i] != 0)
return;
}
++guid.Data3;
if (guid.Data3 != 0)
return;
++guid.Data2;
if (guid.Data2 != 0)
return;
++guid.Data1;
if (guid.Data1 != 0)
return;
}

GenerateGUID(char *chGuid)
{
if (!bGuidInitialized)
{
CoCreateGuid(&guid);
bGuidInitialized = true;
}
else
incrGUID();

WCHAR temp[42];
StringFromGUID2(guid, temp, 42-1);
wcstombs(chGuid, &(temp[1]), 42-1);
chGuid[36] = 0;

if (!onlyOnceLogGUIDAlreadyDone)
{
onlyOnceLogGUIDAlreadyDone = true;
WR_cTools_LogTime(chGuid);
}

return ReturnCode;
}

关于c# - 如何测试 C# Sql server 顺序 GUID 生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11220616/

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