9

以前は文字列ベースの注文IDを生成するために使用していましたが、既存の注文IDを生成するRNGCryptoServiceProviderインスタンスが4つありました。ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@$%^*()_-

そしてそれは私に考えさせました...

次のようなものを使用できないのはなぜですか。

<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]UNIQUEIDENTIFIER ( SQLの世界では別名)を使用することです。

于 2012-08-07T15:21:08.020 に答える
7

常に一意であるとは限りません。

同じミリ秒の間に同じプロセスが実行される場合、それは同一になります。

@Billが述べているように、一意の文字列にはGUIDを使用する必要があります

于 2012-08-07T15:21:16.150 に答える
6

Nowゲッターを何度も呼び出さないでください。文字列を追加している間、「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 に答える