使用C#代碼生成一個隨機的UUID


  在日常開發中常見於生成主鍵的ID,比較規范好用,詳細代碼如下(寫注釋是個好習慣):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Web;

namespace MVCDemo.Models.Common
{
    public static class UuidHelper
    {
        [DllImport("rpcrt4.dll", SetLastError = true)]
        private static extern int UuidCreateSequential(out Guid guid);

        /// <summary>
        /// 生成連續的UUID,底層調用了Windows API UuidCreateSequential。經測試發現,
        /// UuidCreateSequential,在多CPU並發狀態下,有可能會產生重復數據,因此這個方法進行的並發控制,並延遲1毫秒。
        /// 另外,UuidCreateSequential的生成和網絡連接有關(網卡),如果電腦上插了Windows Mobile的手機,會產生新的網絡連接,
        /// 導致UuidCreateSequential出錯,此時,這個方法將使用傳統的Guid來替代Uuid。
        /// </summary>
        /// <returns>在本機生成連續的Guid</returns>
        public static Guid NewUuid()
        {
            Guid result;

            lock (typeof(UuidHelper))
            {
                int hr = UuidCreateSequential(out result);

                if (hr == 0)
                    result = Guid.NewGuid();

                Thread.Sleep(1);
            }

            return result;
        }

        /// <summary>
        /// 生成連續的UUID,底層調用了Windows API UuidCreateSequential
        /// </summary>
        /// <returns>在本機生成連續的Guid</returns>
        public static string NewUuidString()
        {
            Guid result = NewUuid();

            byte[] guidBytes = result.ToByteArray();

            for (int i = 0; i < 8; i++)
            {
                byte t = guidBytes[15 - i];
                guidBytes[15 - i] = guidBytes[i];
                guidBytes[i] = t;
            }

            return new Guid(guidBytes).ToString();
        }
    }

 


免責聲明!

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



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