1.使用場景
通常,在做一些表單的功能時,需要生成唯一不重復的訂單單號,本文提供的幫助類可以適合大多數場景的單號生成使用,拿來即用,方便快捷無重復。而且,在高並發的情況下也是可以使用的。
之前看到有人提供的【時間(時分秒)】+【隨機數字】的方式,個人認為這種方式並不能保證唯一,因為生成的隨機數是可能重復的,在高並發的情況下,在同一秒內是有可能產生兩個相同的編號的。
本文使用的方法是【時間(時分秒)】+【累加數】的方式,使用一個靜態int變量存儲值,在項目運行過程中int值是不斷累加的,一般項目中每秒生成的訂單號不會大於1000條,所以是肯定不會重復的。假如有個非常特殊的項目每秒產生的訂單號可能遠大於1000條,那么只需更改GenerateNo方法中的:
if (_sn == 1000) { _sn = 0; }
將1000調整為更大的整數或者int.MaxValue即可,如果考慮所有單號的位數一致性,可以將_sn.ToString().PadLeft(3, '0')中的3調整為10或更大的位數。
2.代碼
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Helper { /// <summary> /// 單號生成幫助類 /// 2019-10-15 12:10 by boxuming 創建 /// </summary> public class OrderHelper { private static readonly object Locker = new object(); private static int _sn = 0; /// <summary> /// 生成單號 /// </summary> /// <param name="pre">單號前綴</param> /// <returns></returns> public static string GenerateNo(string pre = "") { lock (Locker) //lock 關鍵字可確保當一個線程位於代碼的臨界區時,另一個線程不會進入該臨界區。 { if (_sn == 1000) { _sn = 0; } else { _sn++; } Thread.Sleep(100); return pre + DateTime.Now.ToString("yyyyMMddHHmmss") + _sn.ToString().PadLeft(3, '0'); } } } }