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

Arr*_*row 8 html c# language-agnostic asp.net security

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

它让我思考......

为什么我们不能只使用类似的东西:

<html>
...
<p>@GenerateOrderId()</p>
...
</html>
Run Code Online (Sandbox Code Playgroud)

和:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Fis*_*rdo 19

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

你最好的选择是使用GUID [MSDN-C#] [MSDN-SQL](也就是UNIQUEIDENTIFIER在SQL世界中).

  • 此外,DateTime.Now通常不会实时采样.从MSDN,_"此属性的分辨率取决于系统计时器."_ (2认同)

Cur*_*urt 7

它并不总是独一无二的.

如果在相同的毫秒期间执行相同的过程,那么它将是相同的.

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


Jep*_*sen 6

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