我正在使用远程Web服务进行集成/测试,即使它是“QA”端点,它仍会在每次调用时强制使用唯一的电子邮件地址。
我可以想到DateTime.Now.Ticks
(例如634970372342724417)和Guid.NewGuid()
,但这两者都不能合并到带有max的电子邮件中。 20个字符(或者可以吗?)。
我认为将一个包含最后一个数字的数字写入文件然后使用email1@x.com, email2@x.com, etc...
并不难,但如果我可以避免持续状态,我总是这样做。
有没有人有一个技巧或算法给出一个短的长度“guid”,这是一个相当长的时间段(比如一年)所特有的,我可以用于我的电子邮件地址最大长度为20个字符( guid的最大长度)= 14 = 20 - “@ x.com”的长度?
答案 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