C# 基于日期和自动递增的数字创建唯一的数字
我需要根据日期生成增量数字。 在前一日期(如2014年1月6日)创建的数字不应大于在未来日期(如2014年1月8日)创建的数字。 如何添加日期? 我试了下一个,但很少失败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 +
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