美文网首页
c++实现雪花算法

c++实现雪花算法

作者: 一路向后 | 来源:发表于2021-11-08 23:11 被阅读0次

1.SnowFlake.h

#ifndef _SNOW_FLAKE_H_
#define _SNOW_FLAKE_H_

#include <string>
#include <stdint.h>

typedef long long int64;

class SnowFlake {
public:
    SnowFlake();
    ~SnowFlake();
    int64 getServerIdAsLong();
    int64 getNextId(int64 epoch);

private:
    int64 generateId(int64 epoch, int64 next, int64 shareid);
    int64 m_offset;
    int64 m_last;
    int64 m_shareid;
};

#endif

2.SnowFlake.cpp

#include <iostream>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include "SnowFlake.h"

#define MAX_NEXT 0b1111111111111111L
#define OFFSET 946656000L

using namespace std;

SnowFlake::SnowFlake()
{
    m_offset = 0;
    m_last = 0;
    m_shareid = getServerIdAsLong();
    m_shareid &= 0x1f;
}

SnowFlake::~SnowFlake()
{

}

int64 SnowFlake::getServerIdAsLong()
{
    struct hostent *host = NULL;
    char name[256];
    char szIp[32];
    int64 lIp;
    const char *ret = NULL;

    gethostname(name, sizeof(name));

    host = gethostbyname(name);

    ret = inet_ntop(host->h_addrtype, host->h_addr_list[0], szIp, sizeof(szIp));

    if(ret == NULL)
    {
        cout << "hostname transform to ip failed" << endl;

        return -1;
    }

    lIp = htonl(inet_addr(szIp));

    return lIp;
}

int64 SnowFlake::getNextId(int64 epoch)
{
    int64 next;

    if(epoch < m_last)
    {
        cout << "clock is back: " << epoch << " from previous: " << m_last << endl;

        epoch = m_last;
    }

    if(m_last != epoch)
    {
        m_last = epoch;
        m_offset = 0;
    }

    m_offset++;

    next = m_offset & MAX_NEXT;

    if(next == 0)
    {
        cout << "maximum id reached in 1 second in epoch: " << endl;

        return getNextId(epoch+1);
    }

    return generateId(epoch, next, m_shareid);
}

int64 SnowFlake::generateId(int64 epoch, int64 next, int64 shareid)
{
    return ((epoch-OFFSET) << 21 | (next << 5) | shareid);
}

int main()
{
    SnowFlake sf;
    struct timeval tv;

    gettimeofday(&tv, NULL);

    cout << sf.getNextId(tv.tv_sec) << endl;
    cout << sf.getNextId(tv.tv_sec) << endl;
    cout << sf.getNextId(tv.tv_sec) << endl;

    return 0;
}

3.编译源码

$ g++ -o SnowFlake  SnowFlake.cpp -std=c++11

4.运行及其结果

$ ./SnowFlake 
1446378012147745
1446378012147777
1446378012147809

相关文章

  • c++实现雪花算法

    1.SnowFlake.h 2.SnowFlake.cpp 3.编译源码 4.运行及其结果

  • C++ 经典算法集锦 二

    C++经典算法实现系列2 上回我们说道,牛逼的C++可以实现很多牛逼的算法。我们继续之前的记录。 Algorith...

  • 排序算法详细代码实现

    算法分类 算法时间复杂度 选择排序 插入排序 C++实现 Python实现 冒泡排序 Python实现 归并排序 ...

  • 雪花算法

    雪花算法的原理和实现Java_雨夜青草的博客-CSDN博客_雪花算法 64 = 1 41 10 12

  • 雪花算法,Java实现

    Twwiter的雪花算法是生成分布式id。不考虑业务,我电脑上单台机器每秒能产生380万个id,能满足大部分的需求...

  • java实现雪花算法

    如果你想使用雪花算法大可不必自己写,因为好多jar里都有雪花算法,你可以在你工程里尝试搜索一下snow

  • Java实现雪花算法

    20210826 测试代码 发现会出现重复id,并发1万时只有1~2次重复

  • 记--平方根的算法

    Java实现牛顿迭代法: C/C++实现3d游戏引擎算法实现1/sqrt(x),改一下返回值成为sqrt()算法:...

  • ID生成器之-Twitter雪花算法的Java实现

    SnowFlake Twitter 的 雪花算法 算法的 Java 实现版本。 算法思路 8字节(64位)占位的模...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

网友评论

      本文标题:c++实现雪花算法

      本文链接:https://www.haomeiwen.com/subject/rknpzltx.html