如果是在分布式高并发量的应用下,应该使用客户端的驱动程序来生成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[12];
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);
}
- 欢迎拍砖,你的顶就是我的动力------------不过拍轻点。
|