项目地址 : https://github.com/kelin-xycs/SeqIDGeneratorgit
今天 QQ 群 里有网友问起产生惟一 ID 的方法 有哪些, 讨论了各类方法 。github
有网友提到 Twitter 的 雪花算法 : https://blog.csdn.net/w200221626/article/details/52064976算法
我以为 GUID 的 优势 是 简单 高效, 缺点 是 可读性 比较差 。数据库
高效 是指 相比起 要到 数据库 读取 种子(当前最大序号) 等的方式, 同时 也 简单, 不会出什么问题 。服务器
若是 对 可读性 有要求, 好比 要 显示给 用户 看, 或者 便于 维护, 可使用 针对业务 产生的 连续序号 ID , 好比 订单号 。并发
若是 对 可读性 没什么要求, 那么 用 GUID 就行 。 或者说, 对 可读性 没太多要求 的 场合 能够 通用 GUID 。负载均衡
但不少时候 咱们 也但愿使用 可读性好的 连续序号 ID , 因此就想有一个 简单的 通用的 产生 连续序号 ID 的 方法 。高并发
因此, 就想出了一个 和 Twitter 雪花算法 相似 的 算法 :spa
这种算法 产生的 ID 格式以下 :.net
时间戳-机器ID-序号
时间戳 就是 “20181106213913983” 这样, 表示 2018年11月06日21点39分13秒983毫秒 , 时间戳 取到 毫秒 。
机器ID 就是 计算机 ID, 或者说 服务器 ID, 由于如今 高并发 负载均衡 集群 很常见, 因此须要考虑 多台 Server 并行做业 时 的 状况 。 并行做业 的 Server 之间的 连续序号 ID 不能重复, 对此, Twitter 雪花算法 是 经过 给 每一个 Server 一个 机器ID 来区分 , 因此 咱们 也学 Twitter 雪花算法 这样 。
机器ID 在 App.config 中 配置 :
机器ID 能够 本身随便配置, 不过考虑到 连续序号 ID 的 排序 查询 等, 取成 固定位数 的 数字 比较好 , 好比 上图 中的 “0000”,
4 位 数字 能够支持 1 万 台 Server (0000 ~ 9999) 。
序号 是指 这台计算机上 当前这一毫秒 内 连续序号 ID 的 序号, 这一毫秒内 第一个 连续序号 ID 的 序号 是 0, 第二个是 1, 第三个是 2, 第四个是 3 …… , 以此类推 。 到下一毫秒 序号 会重置为 从 0 从新开始 。
如今程序中写死的 序号 格式 是 4 位 数字, 4 位 数字 能够支持在 一台计算机(多核)上 每毫秒 产生 1 万 个 ID (0000 ~ 9999) 。
效果以下 : (运行 解决方案 中的 Demo 项目 就可看到)