C#生成唯一不重復訂單號幫助類


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');
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM