基于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>

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:47

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

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

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

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

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

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

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

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

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

获取Android设备唯一标识码

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

网游服务器中的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__ #inc

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

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

iOS获取设备唯一标识的8种方法_IOS

8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可以改变设备的 UDID),移动网络可以利用 UDID 来识别移动设备. 许多开发者把 UDID 跟用户的真实姓名.密码.住址.其它数据关联起来,网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据,同时大部分应用确实在频繁传输 UDID 和私人信息. 为了避免集体诉讼,苹果最终决

一在日华人涉嫌私设网游服务器被警方逮捕

中新网1月19日电 据日本新华侨报网报道,1月18日,在日中国籍无业人员付飞(28岁)因使用未注册的网络服务器使中国网民通过非正当渠道访问日本网络游戏,被日本神奈川警方以违反<电信事业法>的理由逮捕.同一天,付飞又因违反日本<入管法>,警方对他实施了再逮捕,并移送检察机关. 据神奈川县的警员介绍,日本的网络游戏在中国是受到限制的.付飞在供述中称,"因为知道日本的网络游戏在中国很受欢迎,而且访问会受到限制,所以想到通过这个方式赚钱". 付飞于去年6月至9月,在自己