如何生成一个在合理时间内不重复的唯一号码?
我正在使用远程Web服务进行集成/测试,即使它是“QA”端点,它仍然会在每个调用上强制执行一个唯一的电子邮件地址。如何生成一个在合理时间内不重复的唯一号码?
我可以想到DateTime.Now.Ticks
(例如634970372342724417)和Guid.NewGuid()
,但这些都不能合并到最大的电子邮件中。 20个字符(或者他们可以吗?)。
我想这不难写出一个数字,其中包含最后使用的数字,然后使用[email protected], [email protected], etc...
但如果我可以避免持续状态,我总是这样做。
有没有人有一个技巧或算法,给出了一个短长度的“guid”,这是一个合理的长时间段(比如一年)独特的,我可以用于我的电子邮件地址的最大长度为20个字符(guid的最大长度)= 14 = 20 - “@ x.com”的长度?
如果您认为您不会在同一个'勾号'中生成两个电子邮件地址,那么您确实可以使用滴答来生成电子邮件地址。
但是,如果刻度是一个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
我正在通过将tick转换为base64来获得您的答案。只需要弄清楚如何处理'+'和'/'... – 2013-02-21 18:33:22
啊..我会将它们转换为' _'和'-'... – 2013-02-21 18:34:01
我编辑了你的答案,以包含我对你的建议进行处理的代码.. – 2013-02-21 18:36:18
既然你指定至少1每次调用之间的第二,这应该工作:
DateTime.Now.ToString("yyyyMMddHHmmss");
其整整14个字符。
这将被限制为每秒通过一个独特的电子邮件... – 2013-02-21 18:36:57
@VenomFangs是的,请参阅OP对该问题的评论。 '这不是一个负载测试。至少有一秒之间拨打电话' – AbZy 2013-02-21 18:38:31
好电话我错过了。 – 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有关日期格式的详细信息。
使用yy和ff +1。但是如果你使用hh而不是HH,那么很可能会有重复。 – AbZy 2013-02-21 18:43:46
是的,这是一个未经过测试的代码示例。如果可能,我喜欢把这些东西放到我的实验室项目中,以确保它们像广告中一样工作。无论如何 - 更新了用户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
的最大字符计数多久你发送请求创建自己的实现呢? – AbZy 2013-02-21 18:19:47
这不是一个负载测试。至少有一秒之间拨打电话 – 2013-02-21 18:20:26
http://stackoverflow.com/questions/4421442/generate-8-digit-uinque-id-in-c-sharp具体来说Jon Skeet的回复可能会对您的情况有所帮助 – 2013-02-21 18:21:40