什么是错误使用DateTime.Now。 作为唯一ID的主要部分?(What is wrong

2019-09-20 23:49发布

我曾经使用RNGCryptoServiceProvider生成基于字符串的订单ID的,但是,有4个实例,其中ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@$%^*()_-会产生一个已经存在的订单ID。

它使我开始思考......

为什么我们不能只使用这样的:

<html>
...
<p>@GenerateOrderId()</p>
...
</html>

和:

public string GenerateOrderId()
{
   return "OID" + 
      DateTime.Now.Year + DateTime.Now.Month +
      DateTime.Now.Day + 
      DateTime.Now.Hour + 
      DateTime.Now.Minute + 
      DateTime.Now.Second + 
      DateTime.Now.Millisecond;
}

有人告诉我,这是一个坏主意,但没有任何解释或理由,它仍然停留在我的头上。 ......我想用这个的原因,是因为它永远是独一无二的。

Answer 1:

计算机在纳秒的速度运行。 你会得到保证几乎立即生成一个重复的订单ID。

您最好的选择是使用GUID [MSDN-C#] [MSDN-SQL] (又名UNIQUEIDENTIFIER在SQL的世界)。



Answer 2:

它不会永远是唯一的。

如果同样的过程被同样毫秒期间进行,那么这将是相同的。

作为@Bill曾表示,你应该使用GUID的唯一的字符串。



Answer 3:

千万不要叫Now的getter很多倍。 “现在,”当你添加字符串可能改变。 你可以DateTime.Now.ToString("yyyyMMddHHmmssfff")或类似的,但它是更好的使用Guid.NewGuid()这一点。



Answer 4:

如果你只是想要一个全局唯一标识符,并且不被打扰左右格式,你为什么不只是使用一个GUID ?

http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

using System;

class Sample 
{
    public static void Main() 
    {
        Guid g = Guid.NewGuid();
        Console.WriteLine(g);
    }
}

它甚至在T-SQL类型 (你很可能是使用给您使用ASP.NET)



Answer 5:

我建议让你的数据库处理的责任,但如果你必须在代码中完成,然后使用GUID。 GUID有被重复的概率很低。

  public string GenerateOrderId()
  {
    return System.Guid.NewGuid().ToString();
  }


Answer 6:

不打一死马,但你的使用DateTime.Now是更值得关注的不是你想要做什么。 你可以重写你的方法和更简洁达到同样的目的:

public string GenerateOrderID()
{
  return "OID" + DateTime.Now.Ticks.ToString();
}

我仍然会建议使用Guid过这种方法。 然而,99%的时间,在Ticks属性会在每次被称为时间给你一个不同的数字。



文章来源: What is wrong with using DateTime.Now. as main part of Unique ID?