9

我曾经用来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;
}

有人告诉我这是个坏主意,但没有任何解释或理由,它仍然留在我的脑海中。...我想使用它的原因是因为它总是独一无二的。

4

6 回答 6

19

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

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

于 2012-08-07T15:21:08.020 回答
7

它不会总是独一无二的。

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

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

于 2012-08-07T15:21:16.150 回答
6

Now永远不要多次调用吸气剂。“现在”可能会在您添加字符串时发生变化。您可以DateTime.Now.ToString("yyyyMMddHHmmssfff")或类似的说法,但最好Guid.NewGuid()用于此。

于 2012-08-07T15:26:32.467 回答
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,你可能会使用它)

于 2012-08-07T15:22:59.723 回答
2

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

  public string GenerateOrderId()
  {
    return System.Guid.NewGuid().ToString();
  }
于 2012-08-07T15:31:25.573 回答
0

不要打败一匹死马,但你的使用DateTime.Now比你想要做的更令人担忧。您可以更简洁地重写您的方法并实现相同的目标:

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

我仍然建议使用Guid这种方法。但是,在 99% 的情况下,Ticks每次调用该属性都会为您提供不同的编号。

于 2012-08-07T15:40:14.207 回答