首页 > 其他 > 详细

创建一个比微软性能更好空间更少的GUID

时间:2015-10-25 12:00:56      阅读:363      评论:0      收藏:0      [点我收藏+]
几年前写过C++版本并测试都没问题,见我以前的链接:http://blog.csdn.net/monster877/article/details/23067189
现在翻译成C#版本,创建10万个GUID的时间只需要3ms左右,C++的或许速度更快,具体算法如下:

1
using System; 3 using System.Collections.Generic; 4 using System.Diagnostics; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace Test 10 { 11 12 //自定义GUID 13 public class MyGuid 14 { 15 /** 16 本程序可以生成64位全游戏大世界全局唯一ID,适合在分布式服务器集群中产生唯一ID 17  特点比微软自带的GUID要节省一倍的空间,即只需要64位的int即可,因此基本上在游戏服务器领域可以抛弃微软的那个GUID了 18 支持每秒生成4096个,在此条件基础上这辈子都不会产生相同的ID 19 20 由 时间戳+服务器区号+平台号+本地递增序号 组成 21 22 时间戳 32bit 23 服务器区号 12bit 24 平台号 8bit 25 递增序号 12bit 26 */ 27 private static ulong c_mark_time_stamp = 0xffffffff00000000;/*时间戳掩码*/ 28 private static ulong c_mark_district = 0x00000000fff00000;/*服务器区号掩码*/ 29 private static ulong c_mark_plat = 0x00000000000ff000;/*服务器里的平台号掩码*/ 30 private static ulong c_mark_base = 0x0000000000000fff;/*本地ID编号掩码*/ 31 private static uint c_baseId = 0;/*本地ID*/ 32 private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 33 34 //生成整个世界里全局唯一的ID district:服务器区号,platform:平台号 [如果游戏只接一个平台,则此平台号可以是服务器集群里的服务器类型编号] 35 public static ulong NewGuid(uint platform, uint district) 36 { 37 ulong timeStamp = (ulong)(DateTime.Now - Jan1st1970).TotalSeconds;//获取自古以来的时间戳 38 ulong newId = ((timeStamp << 32) & c_mark_time_stamp) | ((district << 20) & c_mark_district) | ((platform << 12) & c_mark_plat) | (c_baseId & c_mark_base); 39 40 c_baseId++; 41 42 return newId; 43 } 44 } 45 class Program 46 { 47 static void Main(string[] args) 48 { 49 ulong guid = MyGuid.NewGuid(1, 1); 50 } 51 } 52 }

C++版本:

 

创建一个比微软性能更好空间更少的GUID

原文:http://www.cnblogs.com/legendstudio/p/4908500.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!