C# 如何生成在合理时间内不会重复的唯一编号?

C# 如何生成在合理时间内不会重复的唯一编号?,c#,algorithm,guid,C#,Algorithm,Guid,我正在集成/测试一个远程web服务,尽管它是“QA”端点,但它仍然在每次通话中强制使用一个唯一的电子邮件地址 我可以想到DateTime.Now.Ticks(例如6349703723427417)和Guid.NewGuid(),但它们都不能合并到最多20个字符的电子邮件中(或者可以吗?) 我想写一个包含最后使用的数字的文件,然后使用email1@x.com, email2@x.com等…但如果我可以避免持续状态,我总是这样做 是否有人有一个技巧或算法,可以给出一个短长度的“guid”,该guid

我正在集成/测试一个远程web服务,尽管它是“QA”端点,但它仍然在每次通话中强制使用一个唯一的电子邮件地址

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

我想写一个包含最后使用的数字的文件,然后使用
email1@x.com, email2@x.com等…
但如果我可以避免持续状态,我总是这样做


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

,因为您在每次调用之间至少指定了1秒,这应该起作用:

DateTime.Now.ToString("yyyyMMddHHmmss");

它正好是14个字符。

如果您从约会时间中获得以下数字,您应该能够使其正常工作。。。 例如:

DateTime.Now.ToString("yyMMddHHmmssff");
这是16个字符,剩下4个字符作为您需要的其他前缀

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


查看有关日期时间格式的更多详细信息。

如果您假定不会在同一个“记号”中生成两个电子邮件地址,那么您确实可以使用记号生成电子邮件地址

但是,如果ticks是一个64位的数字,并且您写出了该数字,那么您将得到超过20个字符

诀窍是使用不同的方案对64位数字进行编码。 假设您可以使用西方字母表中的26个字符+10个数字。这使得36个字符成为可能。如果取5位,则可以表示32个字符。这应该足够了。 取64位并将其分成5位一组(64/5约为13组)。每5位翻译一个字符。这样的话,你就有了13个字符,你仍然可以在前面添加一个字符)

收益率:

Gq1rNzbezwg

只是想补充一下。。。如果只想使用记号中的数字,可以使用
子字符串
,例如:

int onlyThisAmount = 20;
string ticks = DateTime.Now.Ticks.ToString();
ticks = ticks.Substring(ticks.Length - onlyThisAmount);
//
///获取唯一的参考号。
/// 
/// 
公共字符串GetUniquerReferenceNumber(char firstChar)
{
var ticks=DateTime.Now.ticks;
var ticksString=ticks.ToString();
var ticksString=ticksString.Substring((ticksString.Length-15>0)?ticksString.Length-15:0);
if(this.currentTicks.Equals(ticks))
{
这个.currentReference++;
如果(this.currentReference>=9999)
{
//只有当有非常快的计算机时。
系统线程线程睡眠(1);
}
return(firstChar+ticksubstring+this.currentReference.ToString(“D4”)).PadRight(20,'9');
}
this.currentReference=-1;
this.currentTicks=滴答声;
return(firstChar+ticksubstring).PadRight(20,'9');
}
在我的例子中,我需要创建一个唯一的参考号,第一个字符唯一,最多20个字符。也许您可以使用下面的功能,它允许您在一个刻度内创建9999个唯一的数字。(含零)


当然,您可以创建自己的实现,而不使用第一个字符和最大字符数20

发送请求的频率是多少?这不是负载测试。呼叫之间至少有一秒钟的间隔,特别是Jon Skeet的响应可能对您的情况有所帮助是否只有一个应用程序必须是唯一的,或者电子邮件在多个实例中必须是唯一的(可能同时调用服务)?只有我和我的dev boxI通过将滴答声转换为base64,我即将得到你的答案。。只需要弄清楚如何处理“+”和“/”…太好了。很高兴我能帮上忙。@Fangs是的,请看OP对这个问题的评论<代码>这不是负载测试。通话间隔至少有一秒钟是的,我也投票支持这个答案-这是一个很好的答案-我标记的答案似乎更可靠一点,但这绝对符合我问题中的“规范”:@AaronAnodide您有权选择最有效的答案,感谢+1:)+1使用yy和ff。但是如果你使用hh而不是hh,很可能会有重复的代码。是的,这是一个未经测试的代码示例。如果可能的话,我喜欢把这些东西放进我的实验室项目中,只是为了确保它们能像广告宣传的那样工作。不管-更新用户HH的答案。
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');
    }