C# 基于日期和自动递增的数字创建唯一的数字

C# 基于日期和自动递增的数字创建唯一的数字,c#,.net,uniqueidentifier,C#,.net,Uniqueidentifier,我需要根据日期生成增量数字。 在前一日期(如2014年1月6日)创建的数字不应大于在未来日期(如2014年1月8日)创建的数字。 如何添加日期? 我试了下一个,但很少失败 static long num =1; public long GetUniqueNumberAsPerDate(DateTime date) { string dateStr = date.ToString("yyMMdd"); long alwaysIncrementeduniqueNum = num +

我需要根据日期生成增量数字。 在前一日期(如2014年1月6日)创建的数字不应大于在未来日期(如2014年1月8日)创建的数字。 如何添加日期? 我试了下一个,但很少失败

static long num =1;
public long GetUniqueNumberAsPerDate(DateTime date)
{
    string dateStr = date.ToString("yyMMdd");
    long alwaysIncrementeduniqueNum = num + 1;

    return Convert.Int64(dateStr + alwaysIncrementeduniqueNum.ToString());
}
失败案例

通过日期:2014-06-06 数字:14 创建编号:14060614

通过日期:2013-06-06 总数:132 创建的编号:130606132(大于14060614)

多个应用程序可以同时调用该函数。所以dateTime(甚至毫秒)可以是相同的
此问题的任何解决方案

问题似乎在于,您的跑步号码(始终递增)在1到1000之间变化。当您进行字符串连接时,最终的数字将具有更少或更多的数字

你可以这样做

   const long k = 1000000;
   long value = long.Parse(dateStr) * k + alwaysIncrementeduniqueNum; 
假设您每天生成的记录不超过
K
,这应该可以保证您不会出现此问题

    public long GetUniqueNumberAsPerDate(DateTime date)
    {
        double dateStr = date.ToOADate();
        dateStr *= 1000000;
        long alwaysIncrementeduniqueNum = num + 1;
        string uniqueNumber = alwaysIncrementeduniqueNum + " " + dateStr;

        return long.Parse(uniqueNumber);
    }
我认为这应该是可行的,它首先将日期转换成十进制数字,然后再将其混合以去除小数,然后将递增的数字作为字符串添加到前面

您可以切换此分段(首先是日期编号),以便以后的日期编号始终更大

我需要根据日期生成增量数字。上一日期创建的数字不应大于下一日期创建的数字

根据这个要求,你可以简单地

date.Ticks
它提供了一个严格随
日期时间增加的数字

如果要避免在同一个记号上出现相等的数字,可以添加

Thread.Sleep(16);
Windows的计时器中断信号为64 Hz。
然而,这意味着您每秒生成的值不能超过64个。

如果您想在计算机上增加数值,可以使用此类

public class IncrementalNumberGenerator
{
    private readonly string _path;
    private readonly EventWaitHandle _waitHandle; 

    public IncrementalNumberGenerator(string path)
    {
        _path = path;
        _waitHandle =  new EventWaitHandle(true, EventResetMode.AutoReset, Guid.NewGuid().ToString("N"));
        if (!File.Exists(_path))
            File.WriteAllText(_path,"0");
    }

    public ulong Next()
    {
        try
        {
            _waitHandle.WaitOne();
            var currentValue = ulong.Parse(File.ReadAllText(_path));
            File.WriteAllText(_path, (currentValue + 1).ToString());
            return currentValue + 1;
        }
        finally
        {
            _waitHandle.Set();
        }
    }
}
这将使用命名的等待句柄在不同的线程和进程上进行同步

像这样使用它

var ing = new IncrementalNumberGenerator(@"c:\data\temp\synch");

需要新号码时,请拨打
Next
。通过使用此类,即使应用程序有多个实例正在运行,或者应用程序重新启动,您也可以获得增量数。

我不明白。为什么不检查一下你的
日期
是否小于
2014年1月8日
。编辑使用
DateTime.Now.Ticks有什么问题?它可以生成重复的值@Niklas@Niklas:是的,dotctor是对的我不知道它将如何独特?因此,对于同一日期,将有许多调用此方法GetUniqueNumberAsPerDate()。甚至毫秒也可以是相同的。所以这个数字就不是唯一的了。如果我错了,请更正OOPS:未完成:)您自己的示例是130606132 vs 14060614,问题与毫秒无关,但运行数字部分分别为132和14。由于使用字符串连接,因此分别产生9位和8位数字。2013年的数字是最大的。使用我的方法,您将得到130606000132和140606000014,这将测试ok。重点是您必须强制日期部分成为生成数字的最重要部分。我假设您将增加数字。它是指向正确方向的伪代码。你可能还应该使代码线程安全。一个更完整(但未经测试)的解决方案可能是,它可以为两个日期在同一个刻度(20毫秒AFAIR)生成重复的值,但他没有提到这是禁止的。如果你将它锁定在线程中并让它在短时间内休眠,它应该会工作,对吗?@Niklas:是的,它会工作,但我想知道是否有任何其他的解决方案可能。我觉得这是个合乎逻辑的问题怎么会是独一无二的?对于相同的datestr(以相同的毫秒),它将返回重复的结果。是否使用增量编号?每次调用此函数时,都应增加alwaysIncrementeduniqueNum,Faster建议相同的解决方案。上升1