使用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
属性会在每次调用时给你一个不同的数字。