使用DateTime.Now有什么问题。 作为唯一ID的主要部分?

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

它让我思考……

为什么我们不能只使用以下内容:

  ... 

@GenerateOrderId()

...

和:

 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; } 

我被告知这是一个坏主意,但没有任何解释或理由,它仍然在我脑海中。 …我之所以要使用它,是因为它永远是独一无二的。

计算机以纳秒速度工作。 您可以保证几乎立即生成重复的订单ID。

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

它并不总是独一无二的。

如果在相同的毫秒内执行相同的过程,那么它将是相同的。

正如@Bill所述,您应该使用GUID作为唯一字符串。

永远不要多次打电话给Now吸气器。 在添加字符串时,“现在”可能会发生变化。 你可以DateTime.Now.ToString("yyyyMMddHHmmssfff")或类似的东西,但为此使用Guid.NewGuid()要好得多。

如果您只想要一个全局唯一标识符并且不关心格式,那么为什么不使用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,您可能会使用它)

我建议让您的数据库处理该职责,但如果您必须在代码中执行此操作,则使用GUID。 GUID被复制的可能性很小。

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

不要打败死马,但你对DateTime.Now的使用比你想要做的更受关注。 您可以重写您的方法并更简洁地实现相同的目标:

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

我仍然建议使用Guid来实现这种方法。 但是,99%的时候, Ticks属性会在每次调用时给你一个不同的数字。