发表于 2015-7-9 09:56:55

浅析MongoDB及C#驱动程序生成ObjectId

  如果是在分布式高并发量的应用下,应该使用客户端的驱动程序来生成ObjectId。如果选择自动生成,增加数据库的负荷。
  


[*]如何使用C#驱动程序生成ObjectId
            一、C#驱动程序选择:mongodb-csharp 项目地址:http://github.com/samus/mongodb-csharp
  二、ObjectId的结构:http://helloyesyes.iteye.com/blog/1089927
  三、了解了ObjectId的结构之后下面是如何实现
  1、TimeStamp (时间戳):
                          private int GenerateTime()
                       {
                              var now = DateTime.UtcNow;                                 
                              var diff = now - BsonInfo.Epoch;
                             return Convert.ToInt32(Math.Floor(diff.TotalSeconds));
                       }
                 2、Machine(主机唯一标识符):
  private byte[] GenerateHostHash()
  {
  var md5 = MD5.Create();
  var host = Dns.GetHostName();
  return md5.ComputeHash(Encoding.Default.GetBytes(host));
  }
  3、Pid (进程标识符):
  private int GenerateProcId()
  {
  var proc = Process.GetCurrentProcess();
  return proc.Id;
  }
  4、Increment (自增计数器):
  private readonly object _inclock = new object();
  private int GenerateInc()
  {
  lock(_inclock)
  {
  return ++_inc;
  }
  }
  5、生成ObjectId
   //生成ObjectId
  public Oid Generate()
  {
  var oid = new byte;
  var copyidx = 0;
  var time = BitConverter.GetBytes(GenerateTime());
  Array.Reverse(time);
  Array.Copy(time, 0, oid, copyidx, 4);
  copyidx += 4;
  Array.Copy(GenerateHostHash(), 0, oid, copyidx, 3);
  copyidx += 3;
  Array.Copy(GenerateProcId(), 2, oid, copyidx, 2);
  copyidx += 2;
  var inc = BitConverter.GetBytes(GenerateInc());
  Array.Reverse(inc);
  Array.Copy(inc, 1, oid, copyidx, 3);
  return new Oid(oid);
  }

[*]欢迎拍砖,你的顶就是我的动力------------不过拍轻点。
页: [1]
查看完整版本: 浅析MongoDB及C#驱动程序生成ObjectId