亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

關于C#生成MongoDB中ObjectId的實現方法

2020-01-24 03:26:23
字體:
來源:轉載
供稿:網友

ObjectId介紹
在MongoDB中,文檔(document)在集合(collection)中的存儲需要一個唯一的_id字段作為主鍵。這個_id默認使用ObjectId來定義,因為ObjectId定義的足夠短小,并盡最大可能的保持唯一性,同時能被快速的生成。

ObjectId 是一個 12 Bytes 的 BSON 類型,其包含
1.4 Bytes 自紀元時間開始的秒數
2.3 Bytes 機器描述符
3.2 Bytes 進程ID
4.3 Bytes 隨機數

從定義可以看出,在同一秒內,在不同的機器上相同進程ID條件下,非常有可能生成相同的ObjectId。
同時可以根據定義判斷出,在給定條件下,ObjectId本身即可描述生成的時間順序

ObjectId的存儲使用Byte數組,而其展現需將Byte數組轉換成字符串進行顯示,所以通常我們看到的ObjectId都類似于:

ObjectId("507f191e810c19729de860ea")

C#定義ObjectId類

復制代碼 代碼如下:

View Code
   public class ObjectId
   {
     private string _string;

     public ObjectId()
     {
     }

     public ObjectId(string value)
       : this(DecodeHex(value))
     {
     }

     internal ObjectId(byte[] value)
     {
       Value = value;
     }

     public static ObjectId Empty
     {
       get { return new ObjectId("000000000000000000000000"); }
     }

     public byte[] Value { get; private set; }

     public static ObjectId NewObjectId()
     {
       return new ObjectId { Value = ObjectIdGenerator.Generate() };
     }

     public static bool TryParse(string value, out ObjectId objectId)
     {
       objectId = Empty;
       if (value == null || value.Length != 24)
       {
         return false;
       }

       try
       {
         objectId = new ObjectId(value);
         return true;
       }
       catch (FormatException)
       {
         return false;
       }
     }

     protected static byte[] DecodeHex(string value)
     {
       if (string.IsNullOrEmpty(value))
         throw new ArgumentNullException("value");

       var chars = value.ToCharArray();
       var numberChars = chars.Length;
       var bytes = new byte[numberChars / 2];

       for (var i = 0; i < numberChars; i += 2)
       {
         bytes[i / 2] = Convert.ToByte(new string(chars, i, 2), 16);
       }

       return bytes;
     }

     public override int GetHashCode()
     {
       return Value != null ? ToString().GetHashCode() : 0;
     }

     public override string ToString()
     {
       if (_string == null && Value != null)
       {
         _string = BitConverter.ToString(Value)
           .Replace("-", string.Empty)
           .ToLowerInvariant();
       }

       return _string;
     }

     public override bool Equals(object obj)
     {
       var other = obj as ObjectId;
       return Equals(other);
     }

     public bool Equals(ObjectId other)
     {
       return other != null && ToString() == other.ToString();
     }

     public static implicit operator string(ObjectId objectId)
     {
       return objectId == null ? null : objectId.ToString();
     }

     public static implicit operator ObjectId(string value)
     {
       return new ObjectId(value);
     }

     public static bool operator ==(ObjectId left, ObjectId right)
     {
       if (ReferenceEquals(left, right))
       {
         return true;
       }

       if (((object)left == null) || ((object)right == null))
       {
         return false;
       }

       return left.Equals(right);
     }

     public static bool operator !=(ObjectId left, ObjectId right)
     {
       return !(left == right);
     }
   }

C#實現ObjectId的生成器
復制代碼 代碼如下:

View Code
   internal static class ObjectIdGenerator
   {
     private static readonly DateTime Epoch =
       new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
     private static readonly object _innerLock = new object();
     private static int _counter;
     private static readonly byte[] _machineHash = GenerateHostHash();
     private static readonly byte[] _processId =
       BitConverter.GetBytes(GenerateProcessId());

     public static byte[] Generate()
     {
       var oid = new byte[12];
       var copyidx = 0;

       Array.Copy(BitConverter.GetBytes(GenerateTime()), 0, oid, copyidx, 4);
       copyidx += 4;

       Array.Copy(_machineHash, 0, oid, copyidx, 3);
       copyidx += 3;

       Array.Copy(_processId, 0, oid, copyidx, 2);
       copyidx += 2;

       Array.Copy(BitConverter.GetBytes(GenerateCounter()), 0, oid, copyidx, 3);

       return oid;
     }

     private static int GenerateTime()
     {
       var now = DateTime.UtcNow;
       var nowtime = new DateTime(Epoch.Year, Epoch.Month, Epoch.Day,
         now.Hour, now.Minute, now.Second, now.Millisecond);
       var diff = nowtime - Epoch;
       return Convert.ToInt32(Math.Floor(diff.TotalMilliseconds));
     }

     private static byte[] GenerateHostHash()
     {
       using (var md5 = MD5.Create())
       {
         var host = Dns.GetHostName();
         return md5.ComputeHash(Encoding.Default.GetBytes(host));
       }
     }

     private static int GenerateProcessId()
     {
       var process = Process.GetCurrentProcess();
       return process.Id;
     }

     private static int GenerateCounter()
     {
       lock (_innerLock)
       {
         return _counter++;
       }
     }
   }

使用舉例
復制代碼 代碼如下:

class Program
   {
     static void Main(string[] args)
     {
       Console.ForegroundColor = ConsoleColor.Red;

       ObjectId emptyOid = ObjectId.Empty;
       Console.WriteLine(emptyOid);

       Console.WriteLine();
       Console.ForegroundColor = ConsoleColor.Green;

       for (int i = 0; i < 10; i++)
       {
         ObjectId oid = ObjectId.NewObjectId();
         Console.WriteLine(oid);
       }

       Console.WriteLine();
       Console.ForegroundColor = ConsoleColor.Blue;

       ObjectId existingOid;
       ObjectId.TryParse("507f191e810c19729de860ea", out existingOid);
       Console.WriteLine(existingOid);

       Console.ReadKey();
     }
   }


 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产亚洲精品2020| 久久手机精品视频| 国产精品九九久久久久久久| 中文.日本.精品| 亚洲第一中文字幕在线观看| 上原亚衣av一区二区三区| 黑人巨大精品欧美一区二区一视频| 91中文字幕在线| 久久综合色88| 欧美激情视频一区二区三区不卡| 九九精品视频在线观看| 狠狠色狠狠色综合日日小说| 亚洲欧美中文另类| 亚洲欧美一区二区激情| 日韩欧美在线观看视频| 午夜精品福利电影| 欧美伦理91i| 在线观看91久久久久久| 78色国产精品| 亚洲图片制服诱惑| 欧美激情亚洲激情| 最近中文字幕mv在线一区二区三区四区| 精品国产一区二区三区久久久| 欧美午夜片欧美片在线观看| 欧美激情久久久久久| 欧美激情一区二区三区高清视频| 欧美成人免费观看| 欧美裸体xxxx极品少妇| 国内精品视频在线| 欧美刺激性大交免费视频| 97视频网站入口| 最近2019年手机中文字幕| 国产一区二区三区在线观看视频| 亚洲一区二区自拍| 国产69精品久久久久9| 超碰97人人做人人爱少妇| 日韩精品视频观看| 日韩视频―中文字幕| 欧美激情按摩在线| 亚洲精品成人av| 欧美激情一区二区三区在线视频观看| 久久成年人免费电影| 精品国产鲁一鲁一区二区张丽| 亚洲色图美腿丝袜| 国产精品久久久久久久久久免费| 亚洲欧美精品伊人久久| 亚洲精品一区二区三区婷婷月| 在线精品高清中文字幕| 日韩激情av在线免费观看| 成人春色激情网| 国产精品热视频| 久久6精品影院| 成人精品aaaa网站| 国产欧美一区二区三区视频| 中国人与牲禽动交精品| 亚洲日本欧美日韩高观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产日韩专区在线| 最新69国产成人精品视频免费| 欧美国产精品日韩| 欧美一级高清免费播放| 欧洲日本亚洲国产区| 亚洲女人天堂网| 日韩乱码在线视频| 久久的精品视频| 国产一区二区三区三区在线观看| 国产精品白嫩初高中害羞小美女| 国产精品午夜国产小视频| 亚洲丝袜在线视频| 久久久在线免费观看| 日韩中文视频免费在线观看| 欧美大片在线免费观看| 亚洲精品乱码久久久久久金桔影视| 亚洲国产精品999| 亚洲电影天堂av| 久久伊人精品一区二区三区| 亚洲成人动漫在线播放| 国模视频一区二区三区| 精品视频在线导航| 欧美日韩国产精品专区| 95av在线视频| 日韩有码视频在线| 亚洲成人精品视频| 青草热久免费精品视频| 精品国产欧美一区二区三区成人| 日韩美女毛茸茸| 色香阁99久久精品久久久| 亚洲欧美一区二区三区久久| 自拍偷拍亚洲一区| 91精品在线观看视频| 国产精品露脸av在线| 成人动漫网站在线观看| 91国语精品自产拍在线观看性色| 精品国产视频在线| 亚洲老头同性xxxxx| 77777亚洲午夜久久多人| 最近中文字幕2019免费| 国产一区二区欧美日韩| 欧美精品video| 国产精品免费视频xxxx| 成人综合网网址| 亚洲成人黄色网| 国产日韩欧美电影在线观看| 欧美日韩在线观看视频| 国产成人精品a视频一区www| 91久久中文字幕| 777国产偷窥盗摄精品视频| 狠狠色狠狠色综合日日五| 成人激情av在线| 国产一区二区av| 日韩电影免费在线观看中文字幕| 国产精品久久久久不卡| 91精品视频观看| 国产91精品久| 影音先锋欧美精品| 97在线视频免费播放| 国产精品欧美久久久| 国产在线视频不卡| 曰本色欧美视频在线| 欧美日韩国产专区| 狠狠色狠狠色综合日日五| 中文在线资源观看视频网站免费不卡| 国产成人一区三区| 国产一区二区三区欧美| 欧美精品在线免费| 91影视免费在线观看| 亚洲国产欧美久久| 欧美中文字幕视频在线观看| 色偷偷亚洲男人天堂| 国产精品都在这里| 亚洲丁香久久久| 色综合视频一区中文字幕| 九九热精品视频| 亚洲欧美日韩区| 亚洲欧美中文字幕在线一区| 热久久这里只有精品| 久久精品国产一区| 国产一区二区三区在线观看网站| 国产a∨精品一区二区三区不卡| 在线亚洲男人天堂| 欧美激情在线一区| 欧美自拍视频在线观看| 久久精品亚洲精品| 精品国产区一区二区三区在线观看| 日韩精品在线观看一区二区| 久操成人在线视频| 国产97在线亚洲| 亚洲va码欧洲m码| 久久久欧美精品| 欧美男插女视频| 欧美激情影音先锋| 国产精品丝袜白浆摸在线| 欧美日韩在线视频首页| 中文一区二区视频| 久久理论片午夜琪琪电影网| 国模吧一区二区三区| 免费99精品国产自在在线| 97视频com| 久久综合伊人77777| 亚洲最大成人免费视频| 成人写真福利网| 亚洲精品国产精品乱码不99按摩| 国产精品九九久久久久久久| 久久综合色影院|