16

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

我能想到DateTime.Now.Ticks(例如634970372342724417)和 Guid.NewGuid()20 个字符(或者可以吗?)。

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

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

4

5 回答 5

24

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

但是,如果 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
于 2013-02-21T18:26:10.340 回答
13

如果您从日期时间中获得以下数字,您应该能够使其工作......类似于:

DateTime.Now.ToString("yyMMddHHmmssff");

这是 16 个字符,剩下 4 个作为您需要的其他前缀。

所以,2013 年 2 月 21 日,大约 10:21 将是“130321102142”,下一个将是“130321102169”,等等......

有关日期时间格式的更多详细信息,请查看http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx

于 2013-02-21T18:22:12.413 回答
12

由于您在每次调用之间指定至少 1 秒,这应该有效:

DateTime.Now.ToString("yyyyMMddHHmmss");

它正好是 14 个字符。

于 2013-02-21T18:21:00.183 回答
0

只是要添加...如果您只想使用刻度中的数字,您可以使用substring,例如:

int onlyThisAmount = 20;
string ticks = DateTime.Now.Ticks.ToString();
ticks = ticks.Substring(ticks.Length - onlyThisAmount);
于 2016-08-26T11:53:34.823 回答
0
    /// <summary>
    /// Get a unique reference number.
    /// </summary>
    /// <returns></returns>
    public string GetUniqueReferenceNumber(char firstChar)
    {
        var ticks = DateTime.Now.Ticks;
        var ticksString = ticks.ToString();
        var ticksSubString = ticksString.Substring((ticksString.Length - 15 > 0) ? ticksString.Length - 15 : 0); 
        if (this.currentTicks.Equals(ticks))
        {
            this.currentReference++;

            if (this.currentReference >= 9999)
            {
                // Only when there are very fast computers.
                System.Threading.Thread.Sleep(1);
            }

            return (firstChar + ticksSubString + this.currentReference.ToString("D4")).PadRight(20, '9');
        }

        this.currentReference = -1;
        this.currentTicks = ticks;
        return (firstChar + ticksSubString).PadRight(20, '9');
    }

在我的情况下,我需要创建一个唯一的参考号,其中包含唯一的第一个字符和最多 20 个字符。也许您可以使用下面的功能,它可以让您在一个刻度内创建 9999 个唯一数字。(包括零)

当然,您可以在没有第一个字符和最大字符数 20 的情况下创建自己的实现

于 2016-11-17T14:46:49.810 回答