
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string uniqueNum = GenerateOrderNumber(); Console.WriteLine("唯一碼:{0}\t 長度為:{1}", uniqueNum, uniqueNum.Length); //測試是否會生成重復 Console.WriteLine("時間+RNGCryptoServiceProvider()結合生成的唯一值,如下:"); string _tempNum = string.Empty; for (int i = 0; i < 1000; i++) { string uNum = GenerateOrderNumber(); Console.WriteLine(uNum); if (string.Equals(uNum, _tempNum)) { Console.WriteLine("上值存在重復,按Enter鍵繼續"); Console.ReadKey(); } //Sleep當前線程,是為了延時,從而不產生重復值。可以把它注釋掉測試看 Thread.Sleep(300); _tempNum = uNum; } } /// <summary> /// 唯一訂單號生成 /// </summary> /// <returns></returns> public static string GenerateOrderNumber() { string strDateTimeNumber = DateTime.Now.ToString("yyyyMMddHHmmssms"); string strRandomResult = NextRandom(1000, 1).ToString(); return strDateTimeNumber + strRandomResult; } /// <summary> /// 參考:msdn上的RNGCryptoServiceProvider例子 /// </summary> /// <param name="numSeeds"></param> /// <param name="length"></param> /// <returns></returns> private static int NextRandom(int numSeeds, int length) { // Create a byte array to hold the random value. byte[] randomNumber = new byte[length]; // Create a new instance of the RNGCryptoServiceProvider. System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); // Fill the array with a random value. rng.GetBytes(randomNumber); // Convert the byte to an uint value to make the modulus operation easier. uint randomResult = 0x0; for (int i = 0; i < length; i++) { randomResult |= ((uint)randomNumber[i] << ((length - 1 - i) * 8)); } return (int)(randomResult % numSeeds) + 1; } } }