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

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

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

uuid.h

#ifndef __UTIL_UUID_H__
#define __UTIL_UUID_H__ #include <stdint.h> namespace utils
{
// twitter snowflake算法
// 64 63--------------22---------12---------0
// 符号位 | 41位时间 |10位机器码|12位自增码|
extern uint64_t get_time(); class unique_id_t
{
public:
unique_id_t();
~unique_id_t(); void set_epoch(uint64_t epoch);
void set_machine(int32_t machine);
int64_t generate(); private:
uint64_t epoch_;
uint64_t time_;
int32_t machine_;
int32_t sequence_;
}; } #endif // !__UTIL_UUID_H__

  

 

uuid.cpp

#include "uuid.h"
#if defined(__GUNC__)
  #include <sys/time.h>
  #include <unistd.h>
  #define EPOCHFILETIME 11644473600000000ULL
#else
  #include <windows.h>
  #include <time.h>
  #define EPOCHFILETIME 11644473600000000Ui64
#endif namespace utils
{ uint64_t get_time()
{
#ifdef __GUNC__
struct timeval tv;
gettimeofday(&tv,NULL); uint64 time = tv.tv_usec;
time /= 1000;
time += (tv.tv_sec * 1000);
return time;
#else
FILETIME filetime;
uint64_t time = 0; GetSystemTimeAsFileTime(&filetime);
time |= filetime.dwHighDateTime;
time <<= 32;
time |= filetime.dwLowDateTime;
time /= 10;
time -= EPOCHFILETIME;
return time / 1000;
#endif
} unique_id_t::unique_id_t()
{
epoch_ = 0;
time_ = 0;
machine_ = 0;
sequence_ = 0;
} unique_id_t::~unique_id_t()
{ } void unique_id_t::set_epoch(uint64_t epoch)
{
epoch_ = epoch;
} void unique_id_t::set_machine(int32_t machine)
{
machine_ = machine;
} int64_t unique_id_t::generate()
{
int64_t value = 0;
uint64_t time = get_time() - epoch_;
// 保留后41位时间
value = time << 22;
// 中间10位是机器ID
value |= (machine_ & 0x3FF) << 12;
// 最后12位是sequenceID
value |= sequence_++ & 0xFFF;
if (sequence_ == 0x1000)
{
sequence_ = 0;
}
return value;
}
} #ifdef __TEST__ #include <iostream> void test()
{
utils::unique_id_t*
  u_id_ptr = new utils::unique_id_t();
u_id_ptr->set_epoch(uint64_t(1367505795100));
u_id_ptr->set_machine(int32_t(100));
for (int i = 0; i < 1024; ++i)
{
std::cout << u_id_ptr->generate() << std::endl;;
}
} #endif

  

 

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

【转】网游服务器中的GUID(唯一标识码)实现-基于snowflake算法的更多相关文章

  1. Android 手机上获取物理唯一标识码[转]

    所有添加有谷歌账户的设备可以返回一个 ANDROID_ID 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添 ...

  2. VBA实现随意输入组合码,查询唯一标识码

    记录背景: 需要在excel中查询出组合码,对应的唯一标识码. 举例 组合码:4+5+6+9+1*2   标识码:A1 界面随意输入组合码:1*2+4+5+6+9  输出标识码:A1 VBA实现: P ...

  3. DeviceUuidFactory【获取设备唯一标识码的UUID(加密)】【需要运行时权限的处理的配合】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于An ...

  4. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  5. Android 手机上获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure;private String android_id ...

  6. Android 获取设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  7. Node.js之网游服务器实践

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 随着Node.js的不断发展与壮大,应用范围也越来越广泛,从传统的企业应用,到互联网使用,再到云计算的发展, ...

  8. js生成guid(唯一标识码)

    在使用postman对接口进行测试的时候,有时候接口日志会要求写入随机标识码,这里我们可以使用js来生成. // Generate four random hex digits. function S ...

  9. Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)

    在我们的APP开发中,通常需要获取到设备的唯一标识.在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬 ...

随机推荐

  1. Linux 文件系统 的 学习

    学习参考大神:http://www.cnblogs.com/yyyyy5101/articles/1901842.html  总结:简介 http://linux.chinaunix.net/tech ...

  2. 09 OCP知识点讲解 之 LRU链与脏LRU链

    OCP知识点讲解 之 LRU链与脏LRU链 分类: Oracle 2012-06-30 10:49:26   一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer c ...

  3. Python的多进程

    这里不说其它,Python的多进程网上已经有很多了,可以尽情搜索.但是用多进程一般是采用对任务的方式,所以注意文件锁定.一般采用Pool是比较合适的.给个网友的小代码 from multiproces ...

  4. chromium之message_pump_default

    看看头文件,默认的消息泵,该类实现了MessagePump的四个接口 class MessagePumpDefault : public MessagePump { public: MessagePu ...

  5. memcache和redis的区别和联系

    一.区别 Memcache : 1,对每个key的数据最大是1M. 2,对各种技术支持比较全面,session可以存储memcache中,各种框架(例如thinkphp)对memcache支持比较好. ...

  6. 搭建Apache服务器并使用自签证书实现https访问

    实验环境:两台Centos7.2的虚拟机,一台作CA服务器,一台作Apache服务器,此处安装httpd-2.4.6的版本. 1)CA服务器 # 私钥一般存放位置:/etc/pki/CA/privat ...

  7. Jquery中菜单的展开和折叠

    jquery内容 <script> $(function () { $("dl dt").click(function () { $(this).siblings(). ...

  8. ACM 2000~2002

    ACM  2000  输入三个字符后,按各个字符的ASCⅡ码从小打到的顺序输出这三个字符. import java.util.Scanner; public class Lengxc {public ...

  9. SQL Server 2012 - 数据更新操作

    SELECT * FROM dbo.Student; --1, 插入数据 Insert ,逗号分隔可以同时插入多条 INSERT dbo.Student ( StuID, Class, StuName ...

  10. Flume采集目录及文件到HDFS案例

    采集目录到HDFS 使用flume采集目录需要启动hdfs集群 vi spool-hdfs.conf # Name the components on this agent a1.sources = ...