我曾经使用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;
}
有人告诉我,这是一个坏主意,但没有任何解释或理由,它仍然停留在我的头上。 ......我想用这个的原因,是因为它永远是独一无二的。
计算机在纳秒的速度运行。 你会得到保证几乎立即生成一个重复的订单ID。
您最好的选择是使用GUID [MSDN-C#] [MSDN-SQL] (又名UNIQUEIDENTIFIER
在SQL的世界)。
它不会永远是唯一的。
如果同样的过程被同样毫秒期间进行,那么这将是相同的。
作为@Bill曾表示,你应该使用GUID的唯一的字符串。
千万不要叫Now
的getter很多倍。 “现在,”当你添加字符串可能改变。 你可以说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
属性会在每次被称为时间给你一个不同的数字。
文章来源: What is wrong with using DateTime.Now. as main part of Unique ID?