生成一个在合理时间内不重复的唯一数字的方法?

时间:2013-02-21 18:15:31

标签: c# algorithm guid

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

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

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

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

5 个答案:

答案 0 :(得分:18)

如果您认为不会以相同的'tick'生成两个电子邮件地址,那么您确实可以使用刻度来生成电子邮件地址。

但是,如果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

答案 1 :(得分:11)

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

DateTime.Now.ToString("yyyyMMddHHmmss");

正好是14个字符。

答案 2 :(得分:8)

如果你从日期时间得到以下数字,你应该可以使它工作...... 像这样的东西:

DateTime.Now.ToString("yyMMddHHmmssff");

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

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

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

答案 3 :(得分:0)

仅添加...如果您只想使用来自刻度的数字,可以使用substring,例如:

int onlyThisAmount = 20;
string ticks = DateTime.Now.Ticks.ToString();
ticks = ticks.Substring(ticks.Length - onlyThisAmount);

答案 4 :(得分: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