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

本文中的算法采用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等等数据,方便记录和追踪。

时间: 2024-10-23 04:57:38

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

黑客操纵“肉鸡” 攻击网游服务器

"黑客"家中自学计算机网络课程后,远程连接异地服务器网上抓取大量"肉鸡",出租给买家,而买家利用这些"肉鸡",发动DDOS攻击网游公司服务器,致使大批玩家网友无法登录.记者从北京海淀警方获悉,民警千里追击,将躲藏在江苏.河南的"黑客"和攻击者抓获,目前,涉案人耿某.李某因涉嫌非法破坏计算机信息系统现已被批捕. 今年1月初,海淀一家大型网游公司向海淀网安大队报警,该公司多个服务器近期遭到大流量的拒绝服务攻击,都陷入瘫痪,致使大批

轻松千人国战 华硕推高承载网游服务器方案

如火如荼的网络游戏产业正吸引着各方的眼光,网游市场作为一个细分且快速成长的市场引起了国内外服务器厂商的格外关注.这个快速成长的市场也意味着客户需求在不断变迁,只有密切关注并不断研究客户需求变迁才能提供更适合客户需求的服务器.网络游戏具有信息双向交流.速度快.不受空间限制等优势,从根本上提高了游戏的互动性.仿真性和竞技性,使游戏玩家在虚拟世界里可以发挥现实世界无法展现的潜能,对于运营商来说,如何提高自身的运维水平,保证全国各地的网络.主机.应用的良好运行,提高用户体验,同时降低运维成本,成了各个网

手机网游:眼下国内APP唯一能赚钱的行当

一位手机游戏高管在微博上说:"手机网游是眼下国内APP唯一能赚钱的行当了."当看到这句话之时,我首先表示由衷的赞同和钦佩,然后表示最崇高的鄙夷和不屑. 无他,一切向钱看罢了.更有甚者,某些手机网游开发者叫嚣着:"等把手机网游玩到数十级,等每个月都花了千把块在它身上,再来说手机网游的是非吧." 一切都是钱遮眼!手机网游确实有前途,但不是靠狂吠换来的,一切以赚钱为衡量依据之时,你会发现整个游戏品质的沦丧. 如果不爱,请你远离游戏行业.唯有爱的纯正,才会有真正的游戏精品出

手机网游是眼下国内APP唯一能赚钱的行当了

一位手机游戏高管在微博上说:"手机网游是眼下国内APP唯一能赚钱的行当了."当看到这句话之时,我首先表示由衷的赞同和钦佩,然后表示最崇高的鄙夷和不屑. 无他,一切向钱看罢了.更有甚者,某些手机网游开发者叫嚣着:"等把手机网游玩到数十级,等每个月都花了千把块在它身上,再来说手机网游的是非吧." 一切都是钱遮眼!手机网游确实有前途,但不是靠狂吠换来的,一切以赚钱为衡量依据之时,你会发现整个游戏品质的沦丧. 如果不爱,请你远离游戏行业.唯有爱的纯正,才会有真正的游戏精品出

手机网游服务器和客户端连接的链路测试!急!

问题描述 最近自己写手机网游服务器,服务器框架已经搭起来了,但是服务器和客户端之间通信的链路测试不知道怎么弄了,请各位高手大侠指点一下小女子,最好有源代码支持,小女子先谢谢各位大侠啦! 解决方案 解决方案二:此处省去87个字解决方案三:希望知道的大侠指点一下!谢谢啦!

用java搞网游服务器开发需要学ssh吗??

问题描述 有大神了解这块的吗??我想搞网游服务器开发现在学的是javaEE和网游服务端还有缘吗?要往网游服务器发展主要该学什么?该学哪个服务器?求大神指导下~~~~~~~谢谢啊 解决方案 解决方案二:有人了解吗~~~~~~~~~~~~解决方案三: 解决方案四: 解决方案五:SSH指三大框架还是?解决方案六: 解决方案七:引用4楼aiien007的回复: SSH指三大框架还是? 恩就是3大框架解决方案八:引用6楼kami12345的回复: Quote: 引用4楼aiien007的回复: SSH指三

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一性并不理想.而通过其他硬件信息标识也因为系统版本.手机硬件等限制存在不同程度的问题. 下面收集了一些"有能力"或"有一定能力"作为设备标识的串码. DEVICE_ID 这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有

基于snowflake算法的网游服务器唯一标识码GUID生成方法

在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位. 网上也有好多PHP写的插件模块,核心用了网络通讯将生成的ID发送给PHP使用,没深入研究PHP的模块写法. 废话不多说了,还是直接上代码好了. uuid.h #ifndef __UTIL_UUID_H__ #define __UTIL_UUID_H__ #include <stdint.h>

充值6万多,不料网游服务器关停

http://www.aliyun.com/zixun/aggregation/38845.html">扬子晚报讯 (通讯员 黄腊梅 王唯唯 记者 贾晓宁)今年26岁的小张(化名)不仅因为网络游戏浪费了很多时间,更浪费了很多金钱.去年,他迷上了一款网游,为了让自己成为游戏里的顶尖角色,他充值了6万多元.但天有不测风云,今年1月,该游戏服务器关闭了. 服务器关闭,小张的虚幻世界被无情击碎了,对小张的打击很大.他多次打电话到网游公司要求服务器快点开放,但是没想到受到更大打击,游戏公司告诉小张,