如何生成一个在合理时间内不重复的唯一号码?

如何生成一个在合理时间内不重复的唯一号码?

问题描述:

我正在使用远程Web服务进行集成/测试,即使它是“QA”端点,它仍然会在每个调用上强制执行一个唯一的电子邮件地址如何生成一个在合理时间内不重复的唯一号码?

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

我想这不难写出一个数字,其中包含最后使用的数字,然后使用[email protected], [email protected], etc...但如果我可以避免持续状态,我总是这样做。

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

+0

的最大字符计数多久你发送请求创建自己的实现呢? – AbZy 2013-02-21 18:19:47

+0

这不是一个负载测试。至少有一秒之间拨打电话 – 2013-02-21 18:20:26

+0

http://*.com/questions/4421442/generate-8-digit-uinque-id-in-c-sharp具体来说Jon Skeet的回复可能会对您的情况有所帮助 – 2013-02-21 18:21:40

如果您认为您不会在同一个'勾号'中生成两个电子邮件地址,那么您确实可以使用滴答来生成电子邮件地址。

但是,如果刻度是一个64位数字,并且您写出该数字,则最终的结果将超过20个字符。

诀窍是使用不同的方案编码您的64位数字。 假设您可以使用西文字母+10位数的26个字符。这使得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 
+0

我正在通过将tick转换为base64来获得您的答案。只需要弄清楚如何处理'+'和'/'... – 2013-02-21 18:33:22

+0

啊..我会将它们转换为' _'和'-'... – 2013-02-21 18:34:01

+1

我编辑了你的答案,以包含我对你的建议进行处理的代码.. – 2013-02-21 18:36:18

既然你指定至少1每次调用之间的第二,这应该工作:

DateTime.Now.ToString("yyyyMMddHHmmss"); 

其整整14个字符。

+0

这将被限制为每秒通过一个独特的电子邮件... – 2013-02-21 18:36:57

+1

@VenomFangs是的,请参阅OP对该问题的评论。 '这不是一个负载测试。至少有一秒之间拨打电话' – AbZy 2013-02-21 18:38:31

+1

好电话我错过了。 – 2013-02-21 18:39:32

如果你从你的日期 - 时间下列数字,你应该能够使它工作... Soemthing像:

DateTime.Now.ToString("yyMMddHHmmssff"); 

这是16个字符,留下4一些其他前缀你需要。

于是,2013年2月21日,在10:21左右将是“130321102142”,下一个将是“130321102169”,等等

看一看http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx有关日期格式的详细信息。

+0

使用yy和ff +1。但是如果你使用hh而不是HH,那么很可能会有重复。 – AbZy 2013-02-21 18:43:46

+1

是的,这是一个未经过测试的代码示例。如果可能,我喜欢把这些东西放到我的实验室项目中,以确保它们像广告中一样工作。无论如何 - 更新了用户HH的答案。 – EtherDragon 2013-02-21 18:58:02

我想补充...如果你想用数只蜱,您可以通过使用substring,例如:

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

/// <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