文章目录

  • 一、C++实现
  • 二、链接

一、C++实现

snowflake.h

#pragma once#include <cstdint>
#include <ctime>
#include <string>namespace snowflake
{/*** @brief 生成序列ID** @return 序列ID*/
uint64_t generateSeqId();
} /* namespace snowflake */

snowflake.cpp

#include "snowflake.h"#include <atomic>
#include <chrono>namespace snowflake
{/*** @brief snow flake序列ID生成器*/
class Snowflake
{public:/*** @brief 构造函数* @param datacenterId - 数据中心ID* @param workerId - 工作机器ID*/Snowflake(uint64_t datacenterId = 0, uint64_t workerId = 0): m_flag(0), m_datacenterId(datacenterId), m_workerId(workerId), m_sequence(0){const auto t = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());m_timestamp = (t.time_since_epoch().count() & 0x1FFFFFFFFFF);}/*** @brief 生成序列ID* * @return 序列ID*/uint64_t generate(){const auto t = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());uint64_t newTime = (t.time_since_epoch().count() & 0x1FFFFFFFFFF);if (newTime == m_timestamp){++m_sequence;}else{m_sequence = 0;m_timestamp = newTime;}return (m_timestamp << 22) + ((m_datacenterId & 0x1F) << 17) + ((m_workerId & 0x1F) << 12)+ (m_sequence & 0xFFF);}private:uint64_t m_flag; /* 符号位(1位), 为0, 通常不用 */uint64_t m_timestamp; /* 时间戳(41位), 精确到毫秒, 支持2^41/365/24/60/60/1000=69.7年 *//* 整个分布式系统内不会产生ID碰撞(由datacenterId和workerId作区分),支持1024个进程 */uint64_t m_datacenterId; /* 数据中心ID(5位) */uint64_t m_workerId; /* 工作机器ID(5位) */uint64_t m_sequence; /* 序列号(12位), 每毫秒从0开始自增, 支持4096个编号 */
};uint64_t generateSeqId()
{static Snowflake s_sf;static std::atomic_flag s_glock = ATOMIC_FLAG_INIT;uint64_t seqId;while (s_glock.test_and_set()) /* 等待原子锁 */;seqId = s_sf.generate();s_glock.clear();return seqId;
}
} /* namespace snowflake */

二、链接

  • 基于snowflake的Id序列号生成器
  • https://github.com/souyunku/SnowFlake

基于snowflake的序列号生成器相关推荐

  1. oracle 全局id,基于SnowFlake 全局ID 生成器 go-id-worker

    snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 0000000 ...

  2. 序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)

    前言 现如今,数据的唯一性和可追溯性变得越来越重要.从简单的数据库主键到复杂的分布式系统,唯一标识符在各种场景中都发挥着关键作用.序列号,作为一种广泛应用的唯一标识符,为我们提供了确保数据完整性和一致 ...

  3. 基于美团Leaf-Segment的双buffer方案实现序列号生成器

    业务背景 有时项目中对于流水号有一些特殊的需求.比如,和业务A有关数据,我们在落库时想要给每条数据添加一个流水号字段,用于作为全局唯一标识.流水号格式规则如下,如:BTA(业务A代号)+年月日(202 ...

  4. 基于单例模式的多键值序列号生成器实现(支持缓存)

    之前在BlogJava上发表过这篇文章,那时没怎么做整理.想不到已经有博友把它弄到ITEye来了(虽然写得水平差,但还是希望那位博友能注明是转载的).这次稍作了整理,自己也加深下印象. 使用场景:用于 ...

  5. 微信序列号生成器架构设计及演变

    一.摘要 微信在立项之初,就已确立了利用数据版本号实现终端与后台的数据增量同步机制,确保发消息时消息可靠送达对方手机,避免了大量潜在的家庭纠纷.时至今日,微信已经走过第五个年头,这套同步机制仍然在消息 ...

  6. Archive of Our Own_开箱用out-of-box Redis序列号生成器 不再写任何代码 你值得拥有

    把简单的东西"傻瓜化"是软件开发追求的目标之一.请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码.这酸爽 ...

  7. 加密解密软件VMProtect教程(八)许可制度之序列号生成器

    VMProtect是新一代软件保护实用程序.VMProtect支持德尔菲.Borland C Builder.Visual C/C++.Visual Basic(本机).Virtual Pascal和 ...

  8. 万亿级调用系统:微信序列号生成器架构设计及演变

    "每天万亿级调用的重量级系统,每次申请序列号平时调用耗时1ms,99.9%的调用耗时小于3ms,服务部署于数百台4核CPU服务器上!" 老司机介绍: 曾钦松,微信高级工程师,目前负 ...

  9. 万亿级调用下的优雅——微信序列号生成器架构设计及演变(上)

    版权声明:本文由曾钦松原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/community/article/200 来源:腾云阁 https://www.qcl ...

  10. oracle中的CURRVAL和NEXTVAL用法(sequence是序列号生成器)

    1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序列呢?其中的作用是什么呢?其实sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字 ...

最新文章

  1. 厦大计算机学硕考研复试,【图片】一战厦大计算机上岸,经验帖。慢更【考研吧】_百度贴吧...
  2. java c3p0 连接 mysql_Java使用C3P0数据源链接数据库
  3. jquery ajax return值不能取得的解决方案
  4. OC语言--SEL类型小记
  5. 使用NuGet发布自己的类库包(Library Package)
  6. 坐标偏差大_控制点的坐标复核(二)
  7. boost::subgraph用法的测试程序
  8. 【转】C++ win32窗口创建详解
  9. get,post请求的编码统一
  10. Ultrabook是什么意思
  11. IDE警告信息不应该被忽略
  12. 跃迁 成为高手的技术
  13. 第一期:一款简单好用的屏幕画笔工具
  14. 郭天祥的10天学会51单片机_第十一节
  15. SAP CO_PA(获利能力分析)专题:业务数据流及BW建模
  16. 免费的网站,堪称神器
  17. 发送邮件工具类 - EmaiHelper
  18. 认证考试:操作系统安全稳定的电脑使用方法!
  19. java字符串去重_java字符串去重方法详解,字符串如何去重?
  20. linux 安装 jdk8u222

热门文章

  1. 消灭WinRAR广告
  2. ubuntu系统下mysql重置密码和修改密码操作
  3. 高等数学下册——引力
  4. lammps教程:Ovito中多晶不同颜色显示技巧
  5. android: 怎么使用腾讯X5WebView
  6. 电子版白底寸照如何制作
  7. java 如何执行dig 命令_dig命令简介
  8. MySQL 数值拼接字符串
  9. vsftpd配置不同用户不同目录
  10. 注解学习(参考尚硅谷视频)