c# - 生成在合理时间内不重复的唯一编号的方法?

标签 c# algorithm guid

我正在集成/测试远程 Web 服务,即使它是“QA”端点,它仍然在每个调用上强制使用唯一的电子邮件地址。

我可以想到 DateTime.Now.Ticks(例如 634970372342724417)和 Guid.NewGuid(),但这些都不能合并到一封电子邮件中。 20 个字符(或者可以吗?)。

我想将包含最后使用的数字的数字写入文件并使用 email1@x.com、email2@x.com 等... 并不难,但是如果我可以避免持久状态,我总是这样做。

有没有人有技巧或算法可以提供短长度“guid”的东西,它在相当长的时间段(比如一年)内是独一无二的,我可以将其用于最大长度为 20 个字符的电子邮件地址( guid 的最大长度)= 14 = 20 - “@x.com”的长度?

最佳答案

如果您假设您不会在同一个“勾号”处生成两个电子邮件地址,那么您确实可以使用这些勾号来生成一个电子邮件地址。

但是,如果 ticks 是一个 64 位数字,并且您写出该数字,您最终会得到超过 20 个字符。

诀窍是使用不同的方案对 64 位数字进行编码。 假设您可以使用 26 个西文字母 + 10 个数字。这使得 36 个可能的字符。如果取5位,可以表示32个字符。这应该足够了。 取 64 位并将它们分成 5 位组(64/5 大约是 13 组)。将每 5 位转换为一个字符。这样你最终得到 13 个字符,你仍然可以在它前面添加一个字符)。

long ticks = DateTime.Now.Ticks;
byte[] bytes = BitConverter.GetBytes(ticks);
string id = Convert.ToBase64String(bytes)
                        .Replace('+', '_')
                        .Replace('/', '-')
                        .TrimEnd('=');
Console.WriteLine (id);

产量:

Gq1rNzbezwg

关于c# - 生成在合理时间内不重复的唯一编号的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009423/

相关文章:

有序组合算法

Powershell 模块 GUID

mysql - Mysql UUID_SHORT() 是否与 UUID() 相当

c# - 手动实例化的 SessionState 提供程序的问题

c# - C# 中的 IDisposable 实现 - 是否可选处置注入(inject)的 IDisposable OK?

c# - 将 XML 中的 ebay web 服务响应转换为 C# 对象?

c# - 对 UuidCreateSequential 生成的顺序 Guid 进行排序

C# - 将数据保存在用户无法打开的文件中

python - 用python找到最大间隔重叠点的最有效方法

algorithm - 解决具有不同模数的链接方程组