@@ -29,34 +29,31 @@ namespace Yitter.IdGenerator | |||||
/// <summary> | /// <summary> | ||||
/// 机器码 | /// 机器码 | ||||
/// 与 WorkerIdBitLength 有关系 | |||||
/// (ushort类型,最大值65535,如果有更高要求,请修改数据类型,或联系作者) | |||||
/// 必须由外部设定,最大值 2^WorkerIdBitLength-1 | |||||
/// </summary> | /// </summary> | ||||
public virtual ushort WorkerId { get; set; } = 0; | public virtual ushort WorkerId { get; set; } = 0; | ||||
/// <summary> | /// <summary> | ||||
/// 机器码位长 | /// 机器码位长 | ||||
/// 范围:1-21(要求:序列数位长+机器码位长不超过22)。 | |||||
/// 建议范围:6-12。 | |||||
/// 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) | |||||
/// </summary> | /// </summary> | ||||
public virtual byte WorkerIdBitLength { get; set; } = 6;//10; | public virtual byte WorkerIdBitLength { get; set; } = 6;//10; | ||||
/// <summary> | /// <summary> | ||||
/// 序列数位长 | /// 序列数位长 | ||||
/// 范围:2-21(要求:序列数位长+机器码位长不超过22)。 | |||||
/// 建议范围:6-14。 | |||||
/// 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) | |||||
/// </summary> | /// </summary> | ||||
public virtual byte SeqBitLength { get; set; } = 6;//10; | public virtual byte SeqBitLength { get; set; } = 6;//10; | ||||
/// <summary> | /// <summary> | ||||
/// 最大序列数(含) | /// 最大序列数(含) | ||||
/// (由SeqBitLength计算的最大值) | |||||
/// 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) | |||||
/// </summary> | /// </summary> | ||||
public virtual int MaxSeqNumber { get; set; } = 0; | public virtual int MaxSeqNumber { get; set; } = 0; | ||||
/// <summary> | /// <summary> | ||||
/// 最小序列数(含) | /// 最小序列数(含) | ||||
/// 默认5,不小于5,不大于MaxSeqNumber | |||||
/// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 | |||||
/// </summary> | /// </summary> | ||||
public virtual ushort MinSeqNumber { get; set; } = 5; | public virtual ushort MinSeqNumber { get; set; } = 5; | ||||
@@ -10,18 +10,25 @@ | |||||
typedef struct IdGenOptions { | typedef struct IdGenOptions { | ||||
/// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | /// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | ||||
uint8_t Method; | uint8_t Method; | ||||
/// 基础时间(ms单位),不能超过当前系统时间 | /// 基础时间(ms单位),不能超过当前系统时间 | ||||
uint64_t BaseTime; | uint64_t BaseTime; | ||||
/// 机器码,与 WorkerIdBitLength 有关系 | |||||
/// 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 | |||||
uint32_t WorkerId; | uint32_t WorkerId; | ||||
/// 机器码位长,范围:1-21(要求:序列数位长+机器码位长不超过22) | |||||
/// 机器码位长,默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) | |||||
uint8_t WorkerIdBitLength; | uint8_t WorkerIdBitLength; | ||||
/// 序列数位长,范围:2-21(要求:序列数位长+机器码位长不超过22) | |||||
/// 序列数位长,默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) | |||||
uint8_t SeqBitLength; | uint8_t SeqBitLength; | ||||
/// 最大序列数(含),(由 SeqBitLength 计算的最大值) | |||||
/// 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) | |||||
uint32_t MaxSeqNumber; | uint32_t MaxSeqNumber; | ||||
/// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber | |||||
/// 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 | |||||
uint32_t MinSeqNumber; | uint32_t MinSeqNumber; | ||||
/// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | ||||
uint32_t TopOverCostCount; | uint32_t TopOverCostCount; | ||||
@@ -9,11 +9,11 @@ package idgen | |||||
type IdGeneratorOptions struct { | type IdGeneratorOptions struct { | ||||
Method uint16 // 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | Method uint16 // 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | ||||
BaseTime int64 // 基础时间(ms单位),不能超过当前系统时间 | BaseTime int64 // 基础时间(ms单位),不能超过当前系统时间 | ||||
WorkerId uint16 // 机器码,与 WorkerIdBitLength 有关系 | |||||
WorkerIdBitLength byte // 机器码位长,范围:1-21(要求:序列数位长+机器码位长不超过22) | |||||
SeqBitLength byte // 序列数位长,范围:2-21(要求:序列数位长+机器码位长不超过22) | |||||
MaxSeqNumber uint32 // 最大序列数(含),(由SeqBitLength计算的最大值) | |||||
MinSeqNumber uint32 // 最小序列数(含),默认5,不小于5,不大于MaxSeqNumber | |||||
WorkerId uint16 // 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 | |||||
WorkerIdBitLength byte // 机器码位长,默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) | |||||
SeqBitLength byte // 序列数位长,默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) | |||||
MaxSeqNumber uint32 // 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) | |||||
MinSeqNumber uint32 // 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 | |||||
TopOverCostCount uint32 // 最大漂移次数(含),默认2000,推荐范围500-10000(与计算能力有关) | TopOverCostCount uint32 // 最大漂移次数(含),默认2000,推荐范围500-10000(与计算能力有关) | ||||
} | } | ||||
@@ -6,7 +6,7 @@ package com.github.yitter.contract; | |||||
/** | /** | ||||
* 雪花算法使用的参数 | * 雪花算法使用的参数 | ||||
* 此处代码不采用 get/set 那种冗长的写法 | |||||
* 参数说明,参考 README.md 的 “配置参数” 章节。 | |||||
*/ | */ | ||||
public class IdGeneratorOptions { | public class IdGeneratorOptions { | ||||
@@ -23,35 +23,32 @@ public class IdGeneratorOptions { | |||||
public long BaseTime = 1582136402000L; | public long BaseTime = 1582136402000L; | ||||
/** | /** | ||||
* 机器码,必须由外部系统设置 | |||||
* 与 WorkerIdBitLength 有关系 | |||||
* (short类型,最大值32766,如果有更高要求,请修改数据类型,或联系作者) | |||||
* 机器码 | |||||
* 必须由外部设定,最大值 2^WorkerIdBitLength-1 | |||||
*/ | */ | ||||
public short WorkerId = 0; | public short WorkerId = 0; | ||||
/** | /** | ||||
* 机器码位长 | * 机器码位长 | ||||
* 范围:1-21(要求:序列数位长+机器码位长不超过22)。 | |||||
* 建议范围:6-12。 | |||||
* 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) | |||||
*/ | */ | ||||
public byte WorkerIdBitLength = 6; | public byte WorkerIdBitLength = 6; | ||||
/** | /** | ||||
* 序列数位长 | * 序列数位长 | ||||
* 范围:2-21(要求:序列数位长+机器码位长不超过22)。 | |||||
* 建议范围:6-14。 | |||||
* 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) | |||||
*/ | */ | ||||
public byte SeqBitLength = 6; | public byte SeqBitLength = 6; | ||||
/** | /** | ||||
* 最大序列数(含) | * 最大序列数(含) | ||||
* (由SeqBitLength计算的最大值) | |||||
* 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) | |||||
*/ | */ | ||||
public short MaxSeqNumber = 0; | public short MaxSeqNumber = 0; | ||||
/** | /** | ||||
* 最小序列数(含) | * 最小序列数(含) | ||||
* 默认5,不小于5,不大于MaxSeqNumber | |||||
* 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 | |||||
*/ | */ | ||||
public short MinSeqNumber = 5; | public short MinSeqNumber = 5; | ||||
@@ -102,23 +102,6 @@ QQ群:646049993 | |||||
🔶 允许时间回拨至本算法预设基数(参数可调)。 | 🔶 允许时间回拨至本算法预设基数(参数可调)。 | ||||
## 💎 配置参数 | |||||
<font color="#11aaff" size="5">❄</font> WorkerIdBitLength,决定 WorkerId 的最大值。 | |||||
<font color="#11aaff" size="5">❄</font> SeqBitLength,决定每毫秒生成的 ID 个数。 | |||||
<font color="#11aaff" size="5">❄</font> WorkerIdBitLength + SeqBitLength 不能超过 22。 | |||||
<font color="#11aaff" size="5">❄</font> WorkerId,最大值 2^WorkerIdBitLength-1。 | |||||
<font color="#11aaff" size="5">❄</font> 默认配置值: | |||||
``` | |||||
WorkerIdBitLength = 6 | |||||
SeqBitLength = 6 | |||||
``` | |||||
## 💎 ID组成 | ## 💎 ID组成 | ||||
* 本算法生成的ID由3部分组成(沿用雪花算法定义): | * 本算法生成的ID由3部分组成(沿用雪花算法定义): | ||||
@@ -163,6 +146,19 @@ SeqBitLength = 6 | |||||
🔵 在支持 4096 个工作节点时,ID可用 1120 年不重复。 | 🔵 在支持 4096 个工作节点时,ID可用 1120 年不重复。 | ||||
## 💎 配置参数 | |||||
<font color="#11aaff" size="5">❄</font> WorkerIdBitLength,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],。 | |||||
<font color="#11aaff" size="5">❄</font> SeqBitLength,自增数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 | |||||
<font color="#11aaff" size="5">❄</font> WorkerId,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 | |||||
<font color="#11aaff" size="5">❄</font> MinSeqNumber,最小自增数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个自增数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 | |||||
<font color="#11aaff" size="5">❄</font> MaxSeqNumber,最大自增数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大自增数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大自增数,一般不用设置最大自增数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小自增数)。 | |||||
## 💎 常规集成 | ## 💎 常规集成 | ||||
1️⃣ 用单例模式调用。外部集成方使用更多的实例并行调用本算法,不会增加ID产出效能,因为本算法采用单线程模式生成ID。 | 1️⃣ 用单例模式调用。外部集成方使用更多的实例并行调用本算法,不会增加ID产出效能,因为本算法采用单线程模式生成ID。 | ||||
@@ -6,18 +6,25 @@ | |||||
pub struct IdGeneratorOptions { | pub struct IdGeneratorOptions { | ||||
/// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | /// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 | ||||
pub Method: u8, | pub Method: u8, | ||||
/// 基础时间(ms单位),不能超过当前系统时间 | /// 基础时间(ms单位),不能超过当前系统时间 | ||||
pub BaseTime: i64, | pub BaseTime: i64, | ||||
/// 机器码,与 WorkerIdBitLength 有关系 | |||||
/// 必须由外部设定,最大值 2^WorkerIdBitLength-1 | |||||
pub WorkerId: u32, | pub WorkerId: u32, | ||||
/// 机器码位长,范围:1-21(要求:序列数位长+机器码位长不超过22) | |||||
/// 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) | |||||
pub WorkerIdBitLength: u8, | pub WorkerIdBitLength: u8, | ||||
/// 序列数位长,范围:2-21(要求:序列数位长+机器码位长不超过22) | |||||
/// 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) | |||||
pub SeqBitLength: u8, | pub SeqBitLength: u8, | ||||
/// 最大序列数(含),(由 SeqBitLength 计算的最大值) | |||||
/// 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) | |||||
pub MaxSeqNumber: u32, | pub MaxSeqNumber: u32, | ||||
/// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber | |||||
/// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 | |||||
pub MinSeqNumber: u32, | pub MinSeqNumber: u32, | ||||
/// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | ||||
pub TopOverCostCount: u32, | pub TopOverCostCount: u32, | ||||
} | } | ||||