网游服务器中的GUID(唯一标识码)实现-基于snowflake算法

作者: NickYang 分类: 技术文章,程序开发 发布时间: 2014-03-03 22:53

本文中的算法采用twitter的snowflake算法,具体请搜索介绍,原来是用Scala写的,因我项目需要,改写成C++语言,主要用于高效的生成唯一的ID, 核心算法就是毫秒级时间(41位)+机器ID(10位)+毫秒内序列(12位).

网上也有好多PHP写的插件模块,核心用了网络通讯将生成的ID发送给PHP使用,没深入研究PHP的模块写法。

废话不多说了,还是直接上代码好了。

uuid.h

uuid.cpp

这样的唯一ID就可以用来表示你系统中使用的例如物品唯一ID,坐骑唯一ID等等数据,方便记录和追踪。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

17条评论
  • LQF

    2015 年 2 月 14 日 17:45

    time = tv.tv_usec / 1000;//取毫秒time += ((uint64_t)tv.tv_sec * 1000);

    其它浏览器 其它操作系统
  • LQF

    2015 年 2 月 14 日 17:43

    tv.tv_sec * 1000 这个地方加个强转((uint64_t)tv.tv_sec * 1000)就不会溢出了。。

    其它浏览器 其它操作系统
    1. eliteYang

      2015 年 2 月 16 日 20:47

      感谢发现问题

      神话 其它浏览器 其它操作系统
  • LQF

    2015 年 2 月 14 日 17:34

    #include #include #include int main(int argc, char** argv){ printf(“%dn”, sizeof(time_t)); printf(“%dn”, sizeof(int64_t)); return 0;}48centos 32位机器

    其它浏览器 其它操作系统
  • LQF

    2015 年 2 月 14 日 17:17

    用你这个在linux上面跑出现了负数。。

    其它浏览器 其它操作系统
    1. eliteYang

      2015 年 2 月 14 日 17:23

      恩,我知道会有负数的,不过不影响使用,因为C++是移位的,跟原本的snowflake算法中的字符串没法比

      神话 其它浏览器 其它操作系统
  • LQF

    2015 年 2 月 14 日 17:16

    linux time_t是long吧。。。。。所以要溢出。。

    其它浏览器 其它操作系统
  • LQF

    2015 年 2 月 13 日 13:34

    time += (tv.tv_sec * 1000); 这个要溢出。

    其它浏览器 其它操作系统
    1. eliteYang

      2015 年 2 月 13 日 21:34

      为善么会溢出,second的位数乘以1000,离64位还远呢

      神话 其它浏览器 其它操作系统
  • dfd

    2014 年 6 月 12 日 11:37

    参见UUID库啊

    潜水 火狐浏览器 Windows XP
    1. eliteYang

      2014 年 6 月 12 日 11:55

      哪个UUID库,给个地址看看

      神话 Chrome浏览器 Windows 7 x64 Edition
  • penwei

    2014 年 5 月 4 日 16:44

    机器ID需要根据每台服务器配置还是自动算的

    潜水 Chrome浏览器 Windows 7 x64 Edition
    1. eliteYang

      2014 年 5 月 4 日 16:47

      可以通过服务器的配置,也可以通过自定义的算法来计算,这个就看自己使用了,只要这个ID能区分开就可以了

      神话 Chrome浏览器 Windows 7 x64 Edition
  • jerry

    2014 年 5 月 4 日 01:44

    utils::unique_id_t* u_id_ptr = new utils::unique_id_t();
    没有delete…指针有这么好么,为毛不用对象

    潜水 Chrome浏览器 Windows 8.1 x64 Edition
    1. eliteYang

      2014 年 5 月 4 日 11:17

      因为如果在逻辑模块中使用,指针获得和判空比较方便,虽然对象也可以通过&方法取出指针,但总没有指针用指针干净利落。所以,什么时候用指针,什么时候用对象,是要区分环境的,没有说哪个好哪个不好的。

      神话 Chrome浏览器 Windows 7 x64 Edition
  • 爱浮夸

    2014 年 3 月 8 日 14:25

    高级东西呀。

    潜水 Chrome浏览器 Windows 7
    1. eliteYang

      2014 年 3 月 8 日 14:27

      也不怎么高级,基础内容, 😆

      神话 Chrome浏览器 Windows 7 x64 Edition

发表评论

电子邮件地址不会被公开。 必填项已用*标注