gpt4 book ai didi

c# - 跨线程生成唯一序列号

转载 作者:太空狗 更新时间:2023-10-30 00:48:50 28 4
gpt4 key购买 nike

我需要从多个线程生成一个唯一的序列号。我在下面创建了一个简单的类,它似乎可以工作,但我不确定我是否可以依赖唯一的序列号。

此外,如果数字超过 999999,我需要能够让数字返回 0。我不希望它滚动很长时间,因为该方法每次调用的次数可能少于 100 次天。我知道系统在有机会达到 999999 之前会定期关闭进行维护。

GetSequenceNumber 方法将从 BizTalk 映射中的 xslt 转换调用,并且该方法可以同时调用多次(在同一 BizTalk 主机实例中)。

在我的开发系统上,它似乎可以正常工作并生成不同的值,即使 BizTalk 同时多次调用该方法也是如此。开发系统只有一个 BizTalk 主机实例在运行。

然而,在生产系统上,有两台服务器。我是否认为这种方法不能保证跨服务器的唯一性,因为它们在不同的应用程序域中运行?

我不能使用 guid,因为序列号被限制为 16 个字符。

public class HelperMethods
{
private static int sequenceNumber = 0;

public string GetSequenceNumber()
{
string result = null;

int seqNo = Interlocked.Increment(ref sequenceNumber);

result = string.Format("{0:MMddHHmmss}{1:000000}", DateTime.Now, seqNo);

return result;
}
}

我想我也许可以使用服务器的计算机名称并在前面加上一些任意字符,这样即使在一台服务器上生成的序列号与另一台服务器相同,它仍然会不同,但我没有确定它将是多么独特。像这样:

    string seqNumber = (MachineName == "Blah" ? "A" : "B") + GetSequenceNumber();

有人对我如何创建唯一序列号有任何建议吗?它不必是完全独特的,我只需要不太可能发生碰撞。另外,如果数字以线程安全的方式达到 1000000,我该如何将数字重置回 0?

最佳答案

这应该可以很好地返回一个 16 个字符的唯一字符串。它基于 Guid 的唯一性。由于 Guid 在使用 Convert.ToBase64String 时会转换为 24 个字符的字符串,因此它会使用 XOR 将字节折叠在自身之上,以确保唯一性分布在所需的 16 个字符中。

Guid gd = Guid.NewGuid();

byte[] ba = gd.ToByteArray();

ba = ba.Zip(ba.Reverse(), (b0, b1) => (byte)(b0 ^ b1)).ToArray();

string mostLikelyUnique16 = Convert.ToBase64String(ba).Substring(0, 16);

我得到类似 8QBIi7JpCeHhCWmy 的结果。

无法保证唯一性,但我认为这会相当不错,尤其是考虑到您的要求允许偶尔发生碰撞。

我做了一个简单的测试,并产生了 100 万个值,没有任何碰撞。

关于c# - 跨线程生成唯一序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057507/

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