From a5958f44537be94aa8f1bb30fc18f514f8eefd26 Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 22:45:43 +0800 Subject: [PATCH 01/35] auto commit --- .../java/com/github/yitter/core/SnowWorkerM1.java | 36 ++-------------------- README.md | 2 +- 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java b/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java index 46402a9..6246b96 100644 --- a/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java +++ b/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java @@ -76,49 +76,17 @@ public class SnowWorkerM1 implements ISnowWorker { } private void BeginOverCostAction(long useTimeTick) { -// if (GenAction == null) { -// return; -// } -// -// DoGenIdAction(new OverCostActionArg( -// WorkerId, -// useTimeTick, -// 1, -// _OverCostCountInOneTerm, -// _GenCountInOneTerm, -// _TermIndex)); + } private void EndOverCostAction(long useTimeTick) { if (_TermIndex > 10000) { _TermIndex = 0; } -// -// if (GenAction == null) { -// return; -// } -// -// DoGenIdAction(new OverCostActionArg( -// WorkerId, -// useTimeTick, -// 2, -// _OverCostCountInOneTerm, -// _GenCountInOneTerm, -// _TermIndex)); } private void BeginTurnBackAction(long useTimeTick) { -// if (GenAction == null) { -// return; -// } -// -// DoGenIdAction(new OverCostActionArg( -// WorkerId, -// useTimeTick, -// 8, -// _OverCostCountInOneTerm, -// _GenCountInOneTerm, -// _TermIndex)); + } private void EndTurnBackAction(long useTimeTick) { diff --git a/README.md b/README.md index dab405b..dd372e7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 比雪花算法更好用的ID生成算法(单机或分布式唯一ID) +# 比雪花算法更好用的ID生成器 ## 💎 算法介绍 From 012d99838be8dda3e764a48d8e9ad1aff6674bbe Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 22:46:16 +0800 Subject: [PATCH 02/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd372e7..5324738 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 比雪花算法更好用的ID生成器 -## 💎 算法介绍 +## 💎 基本介绍 一个全新的雪花漂移算法,生成的ID更短、速度更快。 From 46328d9eae752f5e3173e5000187b5692f8492dd Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 23:26:12 +0800 Subject: [PATCH 03/35] auto commit --- C#.NET/README.md | 4 ++-- C/README.md | 2 +- Go/README.md | 29 +++++++++++++++-------------- Java/README.md | 2 +- Rust/README.md | 20 ++++++++++---------- Rust/source/Cargo.lock | 2 +- Rust/source/Cargo.toml | 11 +++++++++-- Rust/source/README.md | 23 +++++++++++++++++++++++ Rust/source/src/lib.rs | 18 +++++++++--------- 9 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 Rust/source/README.md diff --git a/C#.NET/README.md b/C#.NET/README.md index 4779926..33834f0 100644 --- a/C#.NET/README.md +++ b/C#.NET/README.md @@ -1,9 +1,9 @@ - + ## 运行环境 .NET Standard 2.0+ -## 引用nuget包 +## 引用 nuget 包 ``` ``` diff --git a/C/README.md b/C/README.md index 8dcff92..032b153 100644 --- a/C/README.md +++ b/C/README.md @@ -1,4 +1,4 @@ -# idgenerator +# idgenerator ## 编译说明 diff --git a/Go/README.md b/Go/README.md index 1bff156..44ec2fd 100644 --- a/Go/README.md +++ b/Go/README.md @@ -1,21 +1,9 @@ -# ❄ idenerator-go +# ❄ idenerator-go ## 介绍 项目更多介绍参照:https://github.com/yitter/idgenerator -## Go环境 - -1.SDK,go1.14 - -2.启用 Go-Modules -``` -go env -w GO111MODULE=on - -# Next *ONLY* for China-Users: -go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct -``` - -3. 安装方式 +## 引用全局库 ``` go get -u -v github.com/yitter/idgenerator-go ``` @@ -40,5 +28,18 @@ idgen.SetIdGenerator(options) var newId = idgen.NextId() ``` +## 关于Go环境 + +1.SDK,go1.14 + +2.启用 Go-Modules +``` +go env -w GO111MODULE=on + +# Next *ONLY* for China-Users: +go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct +``` + ## 代码贡献者(按时间顺序) guoyahao | amuluowin | houseme + diff --git a/Java/README.md b/Java/README.md index e045fe5..d4e41af 100644 --- a/Java/README.md +++ b/Java/README.md @@ -1,4 +1,4 @@ - + ## 运行环境 JDK 1.8+ diff --git a/Rust/README.md b/Rust/README.md index 01ddc83..2767343 100644 --- a/Rust/README.md +++ b/Rust/README.md @@ -1,22 +1,22 @@ -# idgenerator +# idgenerator -## ʾRust +## 调用示例(Rust) -1**ȫ** ʼӦóʱִһΣ +第1步,**全局** 初始化(应用程序启动时执行一次): ``` -// IdGeneratorOptions ڹ캯 WorkerId +// 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId: let mut options = IdGeneratorOptions::New(1); -// options.WorkerIdBitLength = 10; // WorkerIdBitLength Ĭֵ6ֵ֧ WorkerId ֵΪ2^6-1 WorkerId 64ø WorkerIdBitLength -// ...... òο IdGeneratorOptions 壬һ˵ֻҪ WorkerIdBitLength WorkerId ֵ +// options.WorkerIdBitLength = 10; // WorkerIdBitLength 默认值6,支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64,可设置更大的 WorkerIdBitLength +// ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。 -// IJöЧ +// 保存参数(必须的操作,否则以上设置都不能生效): YitIdHelper::SetIdGenerator(options); -// ϳʼֻȫһΣұڵ2֮ǰá +// 以上初始化过程只需全局一次,且必须在第2步之前设置。 ``` -2ID +第2步,生成ID: ``` -// ʼԺ󣬼κҪIDĵط· +// 初始化以后,即可在任何需要生成ID的地方,调用以下方法: long newId = YitIdHelper::NextId(); ``` diff --git a/Rust/source/Cargo.lock b/Rust/source/Cargo.lock index 33c508a..f009ef2 100644 --- a/Rust/source/Cargo.lock +++ b/Rust/source/Cargo.lock @@ -269,7 +269,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "yitidgen" +name = "yiter-idgenerator" version = "1.0.0" dependencies = [ "chrono", diff --git a/Rust/source/Cargo.toml b/Rust/source/Cargo.toml index 64350e1..836f386 100644 --- a/Rust/source/Cargo.toml +++ b/Rust/source/Cargo.toml @@ -1,8 +1,15 @@ [package] -name = "yitidgen" +name = "yiter-idgenerator" version = "1.0.0" authors = ["yitter "] edition = "2018" +license = "MIT" +description="Shorter ID and faster generation with a new snowflake drift algorithm. The core is to shorten the ID length, but also can have a very high instantaneous concurrent processing capacity (50W/0.1s), and powerful configuration capacity." +readme = "README.md" +homepage ="https://github.com/yitter/IdGenerator" +repository = "https://github.com/yitter/IdGenerator" +keywords = ["snowflake", "idgenerator"] +#categories = ["command-line-utilities"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -11,7 +18,7 @@ chrono = "0.4.10" lazy_static = "1.4.0" #simple_redis = "*" redis = "0.20.0" -libc="*" +libc = "*" #actix = "0.9.0" #actix-web = "2.0" diff --git a/Rust/source/README.md b/Rust/source/README.md new file mode 100644 index 0000000..2767343 --- /dev/null +++ b/Rust/source/README.md @@ -0,0 +1,23 @@ +# idgenerator + +## 调用示例(Rust) + +第1步,**全局** 初始化(应用程序启动时执行一次): +``` +// 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId: +let mut options = IdGeneratorOptions::New(1); +// options.WorkerIdBitLength = 10; // WorkerIdBitLength 默认值6,支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64,可设置更大的 WorkerIdBitLength +// ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。 + +// 保存参数(必须的操作,否则以上设置都不能生效): +YitIdHelper::SetIdGenerator(options); +// 以上初始化过程只需全局一次,且必须在第2步之前设置。 +``` + +第2步,生成ID: +``` +// 初始化以后,即可在任何需要生成ID的地方,调用以下方法: +long newId = YitIdHelper::NextId(); +``` + + diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index 63a664e..1e4274b 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -14,17 +14,17 @@ use libc::{c_char, uint32_t}; use std::ffi::{CStr, CString}; use std::str; -lazy_static! { - //static ref TestValue: Vec = vec!(0); - // static ref MAP: HashMap = HashMap::new(); - } +// lazy_static! { +// static ref TestValue: Vec = vec!(0); +// static ref MAP: HashMap = HashMap::new(); +// } -// // #[export_name = "SetIdGenerator"] -// #[no_mangle] -// pub extern "C" fn SetIdGenerator(options: IdGeneratorOptions) { -// YitIdHelper::SetIdGenerator(options); -// } +// #[export_name = "SetIdGenerator"] +#[no_mangle] +pub extern "C" fn SetIdGenerator(options: IdGeneratorOptions) { + YitIdHelper::SetIdGenerator(options); +} #[no_mangle] pub extern "C" fn SetOptions(workerId: u32, workerIdBitLength: u8, seqBitLength: u8) { From eb4edad7c69d8dfbf0b72ebf0052e609e2b37611 Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 23:33:06 +0800 Subject: [PATCH 04/35] auto commit --- Rust/source/Cargo.lock | 2 +- Rust/source/Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Rust/source/Cargo.lock b/Rust/source/Cargo.lock index f009ef2..52d1041 100644 --- a/Rust/source/Cargo.lock +++ b/Rust/source/Cargo.lock @@ -269,7 +269,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "yiter-idgenerator" +name = "yitter_idgen" version = "1.0.0" dependencies = [ "chrono", diff --git a/Rust/source/Cargo.toml b/Rust/source/Cargo.toml index 836f386..adf8158 100644 --- a/Rust/source/Cargo.toml +++ b/Rust/source/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "yiter-idgenerator" +name = "yitter_idgen" version = "1.0.0" authors = ["yitter "] edition = "2018" @@ -27,6 +27,6 @@ libc = "*" #redis-async = "0.6.1" [lib] -name = "yitidgen" +name = "yitter_idgen" path = "./src/lib.rs" crate-type = ["cdylib"] From 52b68c62b1638c6acab35f27eda25e2371cd73fb Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 23:40:50 +0800 Subject: [PATCH 05/35] autocommit --- Rust/source/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index 1e4274b..ba04194 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -5,10 +5,10 @@ use yitgen::contract::*; #[macro_use] extern crate lazy_static; -extern crate redis; +// extern crate redis; extern crate libc; -use redis::Commands; +// use redis::Commands; use libc::{c_char, uint32_t}; use std::ffi::{CStr, CString}; From a15315fb589e11adeff55a4215a694dcf8e46106 Mon Sep 17 00:00:00 2001 From: yitter Date: Mon, 5 Apr 2021 23:47:50 +0800 Subject: [PATCH 06/35] autocommit --- Rust/source/Cargo.lock | 187 ------------------------------------------------- Rust/source/Cargo.toml | 14 +--- Rust/source/src/lib.rs | 3 +- 3 files changed, 3 insertions(+), 201 deletions(-) diff --git a/Rust/source/Cargo.lock b/Rust/source/Cargo.lock index 52d1041..664af2e 100644 --- a/Rust/source/Cargo.lock +++ b/Rust/source/Cargo.lock @@ -1,29 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "async-trait" -version = "0.1.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "bytes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" - -[[package]] name = "chrono" version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -37,73 +20,12 @@ dependencies = [ ] [[package]] -name = "combine" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4369b5e4c0cddf64ad8981c0111e7df4f7078f4d6ba98fb31f2e17c4c57b7e" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "idna" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] name = "libc" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba4aede83fc3617411dc6993bc8c70919750c1c257c6ca6a502aed6e0e2394ae" [[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - -[[package]] -name = "memchr" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" - -[[package]] name = "num-integer" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -123,62 +45,6 @@ dependencies = [ ] [[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "proc-macro2" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "quote" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "redis" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8f8d059ead7805e171fc22de8348a3d611c0f985aaa4f5cf6c0dfc7645407" -dependencies = [ - "async-trait", - "combine", - "dtoa", - "itoa", - "percent-encoding", - "sha1", - "url", -] - -[[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - -[[package]] -name = "syn" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] name = "time" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -190,57 +56,6 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" - -[[package]] -name = "url" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -273,7 +88,5 @@ name = "yitter_idgen" version = "1.0.0" dependencies = [ "chrono", - "lazy_static", "libc", - "redis", ] diff --git a/Rust/source/Cargo.toml b/Rust/source/Cargo.toml index adf8158..70d1967 100644 --- a/Rust/source/Cargo.toml +++ b/Rust/source/Cargo.toml @@ -11,20 +11,10 @@ repository = "https://github.com/yitter/IdGenerator" keywords = ["snowflake", "idgenerator"] #categories = ["command-line-utilities"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -chrono = "0.4.10" -lazy_static = "1.4.0" -#simple_redis = "*" -redis = "0.20.0" libc = "*" - -#actix = "0.9.0" -#actix-web = "2.0" -#actix-rt = "1.0" -#actix-redis = "0.8.0" -#redis-async = "0.6.1" +chrono = "0.4.10" +#lazy_static = "1.4.0" [lib] name = "yitter_idgen" diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index ba04194..e26929d 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -4,12 +4,11 @@ use yitgen::gen::YitIdHelper; use yitgen::contract::*; #[macro_use] -extern crate lazy_static; +// extern crate lazy_static; // extern crate redis; extern crate libc; // use redis::Commands; - use libc::{c_char, uint32_t}; use std::ffi::{CStr, CString}; use std::str; From b87af2e8dec4adf6e55d310ecdb3514792562a5a Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 00:18:12 +0800 Subject: [PATCH 07/35] autocommit --- Rust/source/Cargo.lock | 16 ++++++++-------- Rust/source/Cargo.toml | 6 +++--- .../src/{yitgen/gen => idgen}/default_id_generator.rs | 4 +--- .../src/{yitgen/contract => idgen}/i_snow_worker.rs | 0 .../{yitgen/contract => idgen}/id_generator_options.rs | 0 Rust/source/src/idgen/mod.rs | 18 ++++++++++++++++++ .../{yitgen/contract => idgen}/over_cost_action_arg.rs | 0 .../src/{yitgen/core => idgen}/snow_worker_m1.rs | 2 +- .../src/{yitgen/core => idgen}/snow_worker_m2.rs | 2 +- Rust/source/src/{yitgen/gen => idgen}/yit_id_helper.rs | 4 +--- Rust/source/src/lib.rs | 6 ++---- Rust/source/src/main.rs | 5 ++--- Rust/source/src/yitgen/contract/mod.rs | 13 ------------- Rust/source/src/yitgen/core/mod.rs | 10 ---------- Rust/source/src/yitgen/gen/mod.rs | 9 --------- Rust/source/src/yitgen/mod.rs | 3 --- 16 files changed, 37 insertions(+), 61 deletions(-) rename Rust/source/src/{yitgen/gen => idgen}/default_id_generator.rs (87%) rename Rust/source/src/{yitgen/contract => idgen}/i_snow_worker.rs (100%) rename Rust/source/src/{yitgen/contract => idgen}/id_generator_options.rs (100%) create mode 100644 Rust/source/src/idgen/mod.rs rename Rust/source/src/{yitgen/contract => idgen}/over_cost_action_arg.rs (100%) rename Rust/source/src/{yitgen/core => idgen}/snow_worker_m1.rs (96%) rename Rust/source/src/{yitgen/core => idgen}/snow_worker_m2.rs (72%) rename Rust/source/src/{yitgen/gen => idgen}/yit_id_helper.rs (90%) delete mode 100644 Rust/source/src/yitgen/contract/mod.rs delete mode 100644 Rust/source/src/yitgen/core/mod.rs delete mode 100644 Rust/source/src/yitgen/gen/mod.rs delete mode 100644 Rust/source/src/yitgen/mod.rs diff --git a/Rust/source/Cargo.lock b/Rust/source/Cargo.lock index 664af2e..3d07392 100644 --- a/Rust/source/Cargo.lock +++ b/Rust/source/Cargo.lock @@ -20,6 +20,14 @@ dependencies = [ ] [[package]] +name = "idgen" +version = "1.0.0" +dependencies = [ + "chrono", + "libc", +] + +[[package]] name = "libc" version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -82,11 +90,3 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "yitter_idgen" -version = "1.0.0" -dependencies = [ - "chrono", - "libc", -] diff --git a/Rust/source/Cargo.toml b/Rust/source/Cargo.toml index 70d1967..5bd0c1a 100644 --- a/Rust/source/Cargo.toml +++ b/Rust/source/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "yitter_idgen" +name = "idgen" version = "1.0.0" authors = ["yitter "] edition = "2018" @@ -13,10 +13,10 @@ keywords = ["snowflake", "idgenerator"] [dependencies] libc = "*" -chrono = "0.4.10" +chrono = "0.4" #lazy_static = "1.4.0" [lib] -name = "yitter_idgen" +name = "idgen" path = "./src/lib.rs" crate-type = ["cdylib"] diff --git a/Rust/source/src/yitgen/gen/default_id_generator.rs b/Rust/source/src/idgen/default_id_generator.rs similarity index 87% rename from Rust/source/src/yitgen/gen/default_id_generator.rs rename to Rust/source/src/idgen/default_id_generator.rs index 50fa71b..925cc25 100644 --- a/Rust/source/src/yitgen/gen/default_id_generator.rs +++ b/Rust/source/src/idgen/default_id_generator.rs @@ -5,12 +5,10 @@ use std::{thread, time}; use std::net::UdpSocket; use chrono::Utc; -use super::super::contract::*; -use super::super::core::*; -use super::*; use std::sync::Mutex; use std::sync::Arc; use std::borrow::BorrowMut; +use crate::idgen::*; // static mut instance2: Option>> = None; diff --git a/Rust/source/src/yitgen/contract/i_snow_worker.rs b/Rust/source/src/idgen/i_snow_worker.rs similarity index 100% rename from Rust/source/src/yitgen/contract/i_snow_worker.rs rename to Rust/source/src/idgen/i_snow_worker.rs diff --git a/Rust/source/src/yitgen/contract/id_generator_options.rs b/Rust/source/src/idgen/id_generator_options.rs similarity index 100% rename from Rust/source/src/yitgen/contract/id_generator_options.rs rename to Rust/source/src/idgen/id_generator_options.rs diff --git a/Rust/source/src/idgen/mod.rs b/Rust/source/src/idgen/mod.rs new file mode 100644 index 0000000..4de1ec3 --- /dev/null +++ b/Rust/source/src/idgen/mod.rs @@ -0,0 +1,18 @@ +mod default_id_generator; +mod yit_id_helper; +mod snow_worker_m1; +mod snow_worker_m2; +mod id_generator_options; +mod i_snow_worker; +mod over_cost_action_arg; + +use snow_worker_m1::SnowWorkerM1; +use snow_worker_m2::SnowWorkerM2; + +pub use over_cost_action_arg::OverCostActionArg; +pub use yit_id_helper::YitIdHelper; +pub use default_id_generator::DefaultIdGenerator; +pub use id_generator_options::IdGeneratorOptions; +pub use i_snow_worker::ISnowWorker; + + diff --git a/Rust/source/src/yitgen/contract/over_cost_action_arg.rs b/Rust/source/src/idgen/over_cost_action_arg.rs similarity index 100% rename from Rust/source/src/yitgen/contract/over_cost_action_arg.rs rename to Rust/source/src/idgen/over_cost_action_arg.rs diff --git a/Rust/source/src/yitgen/core/snow_worker_m1.rs b/Rust/source/src/idgen/snow_worker_m1.rs similarity index 96% rename from Rust/source/src/yitgen/core/snow_worker_m1.rs rename to Rust/source/src/idgen/snow_worker_m1.rs index 716c778..750eaba 100644 --- a/Rust/source/src/yitgen/core/snow_worker_m1.rs +++ b/Rust/source/src/idgen/snow_worker_m1.rs @@ -2,10 +2,10 @@ * 版权属于:yitter(yitter@126.com) * 开源地址:https://gitee.com/yitter/idgenerator */ -use super::super::contract::*; use std::{thread}; use chrono::Utc; use std::thread::sleep; +use crate::idgen::*; // use lazy_static::lazy_static; pub struct SnowWorkerM1 { diff --git a/Rust/source/src/yitgen/core/snow_worker_m2.rs b/Rust/source/src/idgen/snow_worker_m2.rs similarity index 72% rename from Rust/source/src/yitgen/core/snow_worker_m2.rs rename to Rust/source/src/idgen/snow_worker_m2.rs index a9093c1..e645f35 100644 --- a/Rust/source/src/yitgen/core/snow_worker_m2.rs +++ b/Rust/source/src/idgen/snow_worker_m2.rs @@ -2,7 +2,7 @@ * 版权属于:yitter(yitter@126.com) * 开源地址:https://gitee.com/yitter/idgenerator */ -use super::super::contract::ISnowWorker; +use crate::idgen::*; pub struct SnowWorkerM2 { diff --git a/Rust/source/src/yitgen/gen/yit_id_helper.rs b/Rust/source/src/idgen/yit_id_helper.rs similarity index 90% rename from Rust/source/src/yitgen/gen/yit_id_helper.rs rename to Rust/source/src/idgen/yit_id_helper.rs index ae1e5e7..18c3327 100644 --- a/Rust/source/src/yitgen/gen/yit_id_helper.rs +++ b/Rust/source/src/idgen/yit_id_helper.rs @@ -2,11 +2,9 @@ * 版权属于:yitter(yitter@126.com) * 开源地址:https://gitee.com/yitter/idgenerator */ -use super::super::contract::*; -use super::super::core::*; -use super::*; use std::sync::Mutex; use std::sync::Arc; +use crate::idgen::*; pub struct YitIdHelper; diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index e26929d..9ca3bf5 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -1,7 +1,4 @@ -mod yitgen; - -use yitgen::gen::YitIdHelper; -use yitgen::contract::*; +mod idgen; #[macro_use] // extern crate lazy_static; @@ -12,6 +9,7 @@ extern crate libc; use libc::{c_char, uint32_t}; use std::ffi::{CStr, CString}; use std::str; +pub use idgen::*; // lazy_static! { // static ref TestValue: Vec = vec!(0); diff --git a/Rust/source/src/main.rs b/Rust/source/src/main.rs index 9870a12..70b4e41 100644 --- a/Rust/source/src/main.rs +++ b/Rust/source/src/main.rs @@ -1,7 +1,6 @@ -mod yitgen; +mod idgen; -use yitgen::contract::*; -use yitgen::gen::*; +use idgen::*; use std::thread; use chrono::Utc; use std::time::Duration; diff --git a/Rust/source/src/yitgen/contract/mod.rs b/Rust/source/src/yitgen/contract/mod.rs deleted file mode 100644 index 769f846..0000000 --- a/Rust/source/src/yitgen/contract/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -/* - * 版权属于:yitter(yitter@126.com) - * 开源地址:https://gitee.com/yitter/idgenerator - */ -mod id_generator_options; -mod i_snow_worker; -mod over_cost_action_arg; - -pub use id_generator_options::IdGeneratorOptions; -pub use i_snow_worker::ISnowWorker; -pub use over_cost_action_arg::OverCostActionArg; - - diff --git a/Rust/source/src/yitgen/core/mod.rs b/Rust/source/src/yitgen/core/mod.rs deleted file mode 100644 index 0dec16d..0000000 --- a/Rust/source/src/yitgen/core/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -/* - * 版权属于:yitter(yitter@126.com) - * 开源地址:https://gitee.com/yitter/idgenerator - */ -mod snow_worker_m1; -mod snow_worker_m2; - -pub use snow_worker_m1::SnowWorkerM1; -pub use snow_worker_m2::SnowWorkerM2; - diff --git a/Rust/source/src/yitgen/gen/mod.rs b/Rust/source/src/yitgen/gen/mod.rs deleted file mode 100644 index c0d329c..0000000 --- a/Rust/source/src/yitgen/gen/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -/* - * 版权属于:yitter(yitter@126.com) - * 开源地址:https://gitee.com/yitter/idgenerator - */ -mod default_id_generator; -mod yit_id_helper; - -pub use yit_id_helper::YitIdHelper; -pub use default_id_generator::DefaultIdGenerator; diff --git a/Rust/source/src/yitgen/mod.rs b/Rust/source/src/yitgen/mod.rs deleted file mode 100644 index b12d01c..0000000 --- a/Rust/source/src/yitgen/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod contract; -pub mod core; -pub mod gen; From 8ef0a9f16a7da3dda776bd2bf4783f6adf3fd6f5 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 00:19:58 +0800 Subject: [PATCH 08/35] autocommit --- Rust/source/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rust/source/Cargo.toml b/Rust/source/Cargo.toml index 5bd0c1a..f68b5f8 100644 --- a/Rust/source/Cargo.toml +++ b/Rust/source/Cargo.toml @@ -13,7 +13,7 @@ keywords = ["snowflake", "idgenerator"] [dependencies] libc = "*" -chrono = "0.4" +chrono = "0.4.19" #lazy_static = "1.4.0" [lib] From 21963938dcdc0195998bc567e2f51b7574561757 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 00:27:05 +0800 Subject: [PATCH 09/35] autocommit --- Rust/source/src/lib.rs | 70 -------------------------------------------------- 1 file changed, 70 deletions(-) diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index 9ca3bf5..f3b770d 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -2,21 +2,13 @@ mod idgen; #[macro_use] // extern crate lazy_static; -// extern crate redis; extern crate libc; -// use redis::Commands; use libc::{c_char, uint32_t}; use std::ffi::{CStr, CString}; use std::str; pub use idgen::*; -// lazy_static! { -// static ref TestValue: Vec = vec!(0); -// static ref MAP: HashMap = HashMap::new(); -// } - - // #[export_name = "SetIdGenerator"] #[no_mangle] pub extern "C" fn SetIdGenerator(options: IdGeneratorOptions) { @@ -41,67 +33,5 @@ pub extern "C" fn NextId() -> i64 { YitIdHelper::NextId() } -// static mut TestValue: i32 = 0; -// #[no_mangle] -// pub extern "C" fn Test() -> i32 { -// unsafe { -// TestValue += 1; -// return TestValue; -// } -// } - -// #[no_mangle] -// pub extern "C" -// fn GetWorkerId(ip: *const c_char, port: i32) -> redis::RedisResult { -// // let c_str = unsafe { -// // assert!(!ip.is_null()); -// // CStr::from_ptr(ip) -// // }; -// // -// // let r_str = c_str.to_str(); -// -// // connect to redis -// // let client = redis::Client::open(format!("redis://{}:{}/", String::from(r_str).to_string(), port))?; -// let client = redis::Client::open(format!("redis://localhost:{}/", port))?; -// -// let mut con = client.get_connection()?; -// // throw away the result, just make sure it does not fail -// unsafe { -// let _: () = con.set("my_key111", TestValue.clone())?; -// } -// con.get("my_key") -// // read back the key and return it. Because the return value -// // from the function is a result for integer this will automatically -// // convert into one. -// // -// -// // match simple_redis::create(&format!("redis://{}:{}/", ip, port)) { -// // Ok(mut client) => { -// // println!("Created Redis Client"); -// // -// // let valueString = TestValue.to_string(); -// // let valueString2 = (*TestValue).to_string(); -// // -// // match client.set("my_key", valueString) { -// // Err(error) => println!("Unable to set value in Redis: {}", error), -// // _ => println!("Value set in Redis") -// // }; -// // -// // match client.set("my_key2", valueString2) { -// // Err(error) => println!("Unable to set value in Redis: {}", error), -// // _ => println!("Value set in Redis") -// // }; -// // -// // match client.quit() { -// // Err(error) => println!("Error: {}", error), -// // _ => println!("Connection Closed.") -// // } -// // } -// // Err(error) => println!("Unable to create Redis client: {}", error) -// // } -// -// //return 1; -// } - // build-win-x64: cargo build --release // build-linux-x64: cargo build --target x86_64-unknown-linux-musl --release From b0de7049e352673f975b4e1ef1d95ddf7515b664 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 01:27:27 +0800 Subject: [PATCH 10/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5324738..d1ef7d6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 比雪花算法更好用的ID生成器 +# 比雪花算法更好用的主键ID生成器 ## 💎 基本介绍 From bdbfc4eedb57d131a42957f31d9b37db4af9072f Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:03:37 +0800 Subject: [PATCH 11/35] auto commit --- .../Contract/IdGeneratorOptions.cs | 13 ++++------ C/source/idgen/IdGenOptions.h | 17 ++++++++---- Go/source/idgen/IdGeneratorOptions.go | 10 ++++---- .../github/yitter/contract/IdGeneratorOptions.java | 17 +++++------- README.md | 30 ++++++++++------------ Rust/source/src/idgen/id_generator_options.rs | 17 ++++++++---- 6 files changed, 54 insertions(+), 50 deletions(-) diff --git a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs index 8a54b3b..8dc5450 100644 --- a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs +++ b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs @@ -29,34 +29,31 @@ namespace Yitter.IdGenerator /// /// 机器码 - /// 与 WorkerIdBitLength 有关系 - /// (ushort类型,最大值65535,如果有更高要求,请修改数据类型,或联系作者) + /// 必须由外部设定,最大值 2^WorkerIdBitLength-1 /// public virtual ushort WorkerId { get; set; } = 0; /// /// 机器码位长 - /// 范围:1-21(要求:序列数位长+机器码位长不超过22)。 - /// 建议范围:6-12。 + /// 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) /// public virtual byte WorkerIdBitLength { get; set; } = 6;//10; /// /// 序列数位长 - /// 范围:2-21(要求:序列数位长+机器码位长不超过22)。 - /// 建议范围:6-14。 + /// 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) /// public virtual byte SeqBitLength { get; set; } = 6;//10; /// /// 最大序列数(含) - /// (由SeqBitLength计算的最大值) + /// 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) /// public virtual int MaxSeqNumber { get; set; } = 0; /// /// 最小序列数(含) - /// 默认5,不小于5,不大于MaxSeqNumber + /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 /// public virtual ushort MinSeqNumber { get; set; } = 5; diff --git a/C/source/idgen/IdGenOptions.h b/C/source/idgen/IdGenOptions.h index a50aeaf..03a25c1 100644 --- a/C/source/idgen/IdGenOptions.h +++ b/C/source/idgen/IdGenOptions.h @@ -10,18 +10,25 @@ typedef struct IdGenOptions { /// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 uint8_t Method; + /// 基础时间(ms单位),不能超过当前系统时间 uint64_t BaseTime; - /// 机器码,与 WorkerIdBitLength 有关系 + + /// 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 uint32_t WorkerId; - /// 机器码位长,范围:1-21(要求:序列数位长+机器码位长不超过22) + + /// 机器码位长,默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) uint8_t WorkerIdBitLength; - /// 序列数位长,范围:2-21(要求:序列数位长+机器码位长不超过22) + + /// 序列数位长,默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) uint8_t SeqBitLength; - /// 最大序列数(含),(由 SeqBitLength 计算的最大值) + + /// 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) uint32_t MaxSeqNumber; - /// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber + + /// 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 uint32_t MinSeqNumber; + /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) uint32_t TopOverCostCount; diff --git a/Go/source/idgen/IdGeneratorOptions.go b/Go/source/idgen/IdGeneratorOptions.go index 136179a..11e7761 100644 --- a/Go/source/idgen/IdGeneratorOptions.go +++ b/Go/source/idgen/IdGeneratorOptions.go @@ -9,11 +9,11 @@ package idgen type IdGeneratorOptions struct { Method uint16 // 雪花计算方法,(1-漂移算法|2-传统算法),默认1 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(与计算能力有关) } diff --git a/Java/source/src/main/java/com/github/yitter/contract/IdGeneratorOptions.java b/Java/source/src/main/java/com/github/yitter/contract/IdGeneratorOptions.java index 8c56dae..0bbe49e 100644 --- a/Java/source/src/main/java/com/github/yitter/contract/IdGeneratorOptions.java +++ b/Java/source/src/main/java/com/github/yitter/contract/IdGeneratorOptions.java @@ -6,7 +6,7 @@ package com.github.yitter.contract; /** * 雪花算法使用的参数 - * 此处代码不采用 get/set 那种冗长的写法 + * 参数说明,参考 README.md 的 “配置参数” 章节。 */ public class IdGeneratorOptions { @@ -23,35 +23,32 @@ public class IdGeneratorOptions { public long BaseTime = 1582136402000L; /** - * 机器码,必须由外部系统设置 - * 与 WorkerIdBitLength 有关系 - * (short类型,最大值32766,如果有更高要求,请修改数据类型,或联系作者) + * 机器码 + * 必须由外部设定,最大值 2^WorkerIdBitLength-1 */ public short WorkerId = 0; /** * 机器码位长 - * 范围:1-21(要求:序列数位长+机器码位长不超过22)。 - * 建议范围:6-12。 + * 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) */ public byte WorkerIdBitLength = 6; /** * 序列数位长 - * 范围:2-21(要求:序列数位长+机器码位长不超过22)。 - * 建议范围:6-14。 + * 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) */ public byte SeqBitLength = 6; /** * 最大序列数(含) - * (由SeqBitLength计算的最大值) + * 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) */ public short MaxSeqNumber = 0; /** * 最小序列数(含) - * 默认5,不小于5,不大于MaxSeqNumber + * 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 */ public short MinSeqNumber = 5; diff --git a/README.md b/README.md index d1ef7d6..e5a1696 100644 --- a/README.md +++ b/README.md @@ -102,23 +102,6 @@ QQ群:646049993 🔶 允许时间回拨至本算法预设基数(参数可调)。 -## 💎 配置参数 - - WorkerIdBitLength,决定 WorkerId 的最大值。 - - SeqBitLength,决定每毫秒生成的 ID 个数。 - - WorkerIdBitLength + SeqBitLength 不能超过 22。 - - WorkerId,最大值 2^WorkerIdBitLength-1。 - - 默认配置值: - -``` -WorkerIdBitLength = 6 -SeqBitLength = 6 -``` - ## 💎 ID组成 * 本算法生成的ID由3部分组成(沿用雪花算法定义): @@ -163,6 +146,19 @@ SeqBitLength = 6 🔵 在支持 4096 个工作节点时,ID可用 1120 年不重复。 +## 💎 配置参数 + + WorkerIdBitLength,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],。 + + SeqBitLength,自增数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + + WorkerId,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + + MinSeqNumber,最小自增数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个自增数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 + + MaxSeqNumber,最大自增数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大自增数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大自增数,一般不用设置最大自增数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小自增数)。 + + ## 💎 常规集成 1️⃣ 用单例模式调用。外部集成方使用更多的实例并行调用本算法,不会增加ID产出效能,因为本算法采用单线程模式生成ID。 diff --git a/Rust/source/src/idgen/id_generator_options.rs b/Rust/source/src/idgen/id_generator_options.rs index f190505..6454b7d 100644 --- a/Rust/source/src/idgen/id_generator_options.rs +++ b/Rust/source/src/idgen/id_generator_options.rs @@ -6,18 +6,25 @@ pub struct IdGeneratorOptions { /// 雪花计算方法,(1-漂移算法|2-传统算法),默认1 pub Method: u8, + /// 基础时间(ms单位),不能超过当前系统时间 pub BaseTime: i64, - /// 机器码,与 WorkerIdBitLength 有关系 + + /// 必须由外部设定,最大值 2^WorkerIdBitLength-1 pub WorkerId: u32, - /// 机器码位长,范围:1-21(要求:序列数位长+机器码位长不超过22) + + /// 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) pub WorkerIdBitLength: u8, - /// 序列数位长,范围:2-21(要求:序列数位长+机器码位长不超过22) + + /// 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) pub SeqBitLength: u8, - /// 最大序列数(含),(由 SeqBitLength 计算的最大值) + + /// 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) pub MaxSeqNumber: u32, - /// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber + + /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 pub MinSeqNumber: u32, + /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) pub TopOverCostCount: u32, } From 2ee5c97b88468696b00266a4feb463376463b355 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:04:11 +0800 Subject: [PATCH 12/35] auto commit --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e5a1696..eb45c4f 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ QQ群:646049993 ## 新算法特点 - 整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置 WorkerId 是6bit,自增数是6bit) + 整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置 WorkerId 是6bit,序列数是6bit) 速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个。(i7笔记本,默认算法配置6bit+6bit) @@ -106,13 +106,13 @@ QQ群:646049993 * 本算法生成的ID由3部分组成(沿用雪花算法定义): * +-------------------------+--------------+----------+ - * | 1.相对基础时间的时间差 | 2.WorkerId | 3.自增数 | + * | 1.相对基础时间的时间差 | 2.WorkerId | 3.序列数 | * +-------------------------+--------------+----------+ * +-------------------------+---- 6 bits ---+- 6 bits -+ * * 第1部分,时间差,是生成ID时的系统时间减去 BaseTime 的总时间差(毫秒单位)。 * 第2部分,WorkerId,是区分不同机器或不同应用的唯一ID,最大值由 WorkerIdBitLength(默认6)限定。 - * 第3部分,自增数,是每毫秒下的自增数,由参数中的 SeqBitLength(默认6)限定。 + * 第3部分,序列数,是每毫秒下的序列数,由参数中的 SeqBitLength(默认6)限定。 ## 💎 ID示例 @@ -146,17 +146,17 @@ QQ群:646049993 🔵 在支持 4096 个工作节点时,ID可用 1120 年不重复。 -## 💎 配置参数 +## 💎 参数设置 - WorkerIdBitLength,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],。 + WorkerIdBitLength,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - SeqBitLength,自增数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + SeqBitLength,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - WorkerId,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + WorkerId,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 - MinSeqNumber,最小自增数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个自增数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 + MinSeqNumber,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 - MaxSeqNumber,最大自增数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大自增数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大自增数,一般不用设置最大自增数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小自增数)。 + MaxSeqNumber,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 ## 💎 常规集成 From 56af98fcfc629410913ca6ad24edf64bb4355b85 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:06:59 +0800 Subject: [PATCH 13/35] auto commit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index eb45c4f..294f5af 100644 --- a/README.md +++ b/README.md @@ -148,15 +148,15 @@ QQ群:646049993 ## 💎 参数设置 - WorkerIdBitLength,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 + **WorkerIdBitLength**,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - SeqBitLength,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + **SeqBitLength**,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - WorkerId,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + **WorkerId**,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 - MinSeqNumber,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 + **MinSeqNumber**,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 - MaxSeqNumber,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 + **MaxSeqNumber**,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 ## 💎 常规集成 From 5826b6aa1ce8f171ecdca52d7a0dc25f372ca077 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:09:49 +0800 Subject: [PATCH 14/35] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs | 2 +- C/source/idgen/IdGenOptions.h | 2 +- Go/source/idgen/IdGeneratorOptions.go | 2 +- README.md | 10 +++++----- Rust/source/src/idgen/id_generator_options.rs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs index 8dc5450..c5ee938 100644 --- a/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs +++ b/C#.NET/source/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs @@ -53,7 +53,7 @@ namespace Yitter.IdGenerator /// /// 最小序列数(含) - /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 + /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 /// public virtual ushort MinSeqNumber { get; set; } = 5; diff --git a/C/source/idgen/IdGenOptions.h b/C/source/idgen/IdGenOptions.h index 03a25c1..deedafc 100644 --- a/C/source/idgen/IdGenOptions.h +++ b/C/source/idgen/IdGenOptions.h @@ -26,7 +26,7 @@ typedef struct IdGenOptions { /// 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) uint32_t MaxSeqNumber; - /// 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 + /// 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 uint32_t MinSeqNumber; /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) diff --git a/Go/source/idgen/IdGeneratorOptions.go b/Go/source/idgen/IdGeneratorOptions.go index 11e7761..f1fe52f 100644 --- a/Go/source/idgen/IdGeneratorOptions.go +++ b/Go/source/idgen/IdGeneratorOptions.go @@ -13,7 +13,7 @@ type IdGeneratorOptions struct { 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是手工新值预留位 + MinSeqNumber uint32 // 最小序列数(含),默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 TopOverCostCount uint32 // 最大漂移次数(含),默认2000,推荐范围500-10000(与计算能力有关) } diff --git a/README.md b/README.md index 294f5af..ecd9ee4 100644 --- a/README.md +++ b/README.md @@ -148,15 +148,15 @@ QQ群:646049993 ## 💎 参数设置 - **WorkerIdBitLength**,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 + **WorkerIdBitLength**,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - **SeqBitLength**,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + **SeqBitLength**,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - **WorkerId**,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + **WorkerId**,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 - **MinSeqNumber**,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 + **MinSeqNumber**,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 - **MaxSeqNumber**,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 + **MaxSeqNumber**,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 ## 💎 常规集成 diff --git a/Rust/source/src/idgen/id_generator_options.rs b/Rust/source/src/idgen/id_generator_options.rs index 6454b7d..d649b03 100644 --- a/Rust/source/src/idgen/id_generator_options.rs +++ b/Rust/source/src/idgen/id_generator_options.rs @@ -22,7 +22,7 @@ pub struct IdGeneratorOptions { /// 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) pub MaxSeqNumber: u32, - /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 + /// 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 pub MinSeqNumber: u32, /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) From 89c6bceea4431dab89f45ee36dd3de086b190952 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:10:37 +0800 Subject: [PATCH 15/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ecd9ee4..f103abc 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ QQ群:646049993 **WorkerId**,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 - **MinSeqNumber**,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 + ***MinSeqNumber***,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 **MaxSeqNumber**,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 From 4535c4ad0642be9312a7ef17a0b9494178df49df Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:11:06 +0800 Subject: [PATCH 16/35] auto commit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f103abc..55c69c5 100644 --- a/README.md +++ b/README.md @@ -148,15 +148,15 @@ QQ群:646049993 ## 💎 参数设置 - **WorkerIdBitLength**,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 + ****WorkerIdBitLength****,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - **SeqBitLength**,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - **WorkerId**,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + **WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 ***MinSeqNumber***,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 - **MaxSeqNumber**,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 + ***MaxSeqNumber***,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 ## 💎 常规集成 From 74264f1e5879b434d7ed3886ab0d04c7672d640c Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:11:32 +0800 Subject: [PATCH 17/35] auto commit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 55c69c5..dd2a574 100644 --- a/README.md +++ b/README.md @@ -148,11 +148,11 @@ QQ群:646049993 ## 💎 参数设置 - ****WorkerIdBitLength****,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 + ***WorkerIdBitLength***,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - **WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 ***MinSeqNumber***,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 From c1ad6b776a68e4dec40057580d023c151e635688 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:12:15 +0800 Subject: [PATCH 18/35] auto commit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd2a574..968abf0 100644 --- a/README.md +++ b/README.md @@ -150,10 +150,10 @@ QQ群:646049993 ***WorkerIdBitLength***,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 - ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 + ***MinSeqNumber***,最小序列数,默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位。 ***MaxSeqNumber***,最大序列数,设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]),不为0时,用该设置值为最大序列数,一般不用设置最大序列数,除非多机共享WorkerId分段生成ID(此时还要正确设置最小序列数)。 From 506656c1dfaeae470e486ea66d507f6694bc122e Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:13:35 +0800 Subject: [PATCH 19/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 968abf0..d3637ca 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ QQ群:646049993 ## 💎 参数设置 - ***WorkerIdBitLength***,WorkerId位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 + ***WorkerIdBitLength***,机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 From d390b1739784b98da3c7593fe0f00d0a3cc1334e Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:20:38 +0800 Subject: [PATCH 20/35] auto commit --- Java/README.md | 2 +- Java/source/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Java/README.md b/Java/README.md index d4e41af..f3efdad 100644 --- a/Java/README.md +++ b/Java/README.md @@ -8,7 +8,7 @@ JDK 1.8+ com.github.yitter yitter-idgenerator - 1.0.5 + 1.0.6 ``` diff --git a/Java/source/pom.xml b/Java/source/pom.xml index a12a031..3c27bdc 100644 --- a/Java/source/pom.xml +++ b/Java/source/pom.xml @@ -6,7 +6,7 @@ com.github.yitter yitter-idgenerator - 1.0.5 + 1.0.6 jar yitter-idgenerator From ae98c7493bd21a1964b15be5677b09f949d25258 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:21:47 +0800 Subject: [PATCH 21/35] auto commit --- C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj b/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj index 1994ba4..3e634fa 100644 --- a/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj +++ b/C#.NET/source/Yitter.IdGenerator/Yitter.IdGenerator.csproj @@ -18,7 +18,7 @@ Yitter https://github.com/yitter/idgenerator MIT - 1.0.11 + 1.0.12 From 7515e3e6d58a112a88702a82fdca302fcca506e3 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 11:28:08 +0800 Subject: [PATCH 22/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d3637ca..367b676 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ QQ群:646049993 ***WorkerIdBitLength***,机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32766,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 From f1c9920413dde0a7a54f41a5a796e6bcc155649f Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 13:37:35 +0800 Subject: [PATCH 23/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 367b676..07b9cda 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 比雪花算法更好用的主键ID生成器 +# 比雪花算法更好用的数据主键新算法 ## 💎 基本介绍 From 41827bf64384976955452dc6f82eacabe5d349c4 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 21:42:49 +0800 Subject: [PATCH 24/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 07b9cda..d2f1240 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ QQ群:646049993 ## 自动注册WorkerId -🔍 唯一ID生成器,依赖WorkerId,当业务服务需要水平自动化复制时,就要求它能自动化注册全局唯一WorkerId,然后各个容器化的无差别部署的业务服务,才能根据它生产唯一ID。 +🔍 唯一ID生成器,依赖WorkerId,当业务服务需要水平无差别复制时,就要求它能自动注册全局唯一WorkerId,然后才能根据它生产唯一ID。 🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。动态库提供的C接口方法可参考 源码文件 [ Tools/AutoRegisterWorkerId/lib/yitidgengo.h ] From 71e6657b526a6733c37946d5f2f969e878b36258 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 21:45:54 +0800 Subject: [PATCH 25/35] auto commit --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d2f1240..cb292a7 100644 --- a/README.md +++ b/README.md @@ -193,8 +193,19 @@ QQ群:646049993 🔍 唯一ID生成器,依赖WorkerId,当业务服务需要水平无差别复制时,就要求它能自动注册全局唯一WorkerId,然后才能根据它生产唯一ID。 -🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。动态库提供的C接口方法可参考 -源码文件 [ Tools/AutoRegisterWorkerId/lib/yitidgengo.h ] +🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。由于动态库文件较大,目前源码中不含编译后的 so (linux)和 dll(windows)文件。 + +动态库接口定义: +``` +// 注册一个 WorkerId,会先注销所有本机已注册的记录 +extern __declspec(dllexport) GoInt32 RegisterOne(char* ip, GoInt32 port, char* password, GoInt32 maxWorkerId); + +// 注销本机已注册的 WorkerId +extern __declspec(dllexport) void UnRegister(); + +// 检查本地WorkerId是否有效(0-有效,其它-无效) +extern __declspec(dllexport) GoInt32 Validate(GoInt32 workerId); +``` redis作用 From f8cb6b9ac5abd7d04acda479c12356e3dd97b069 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 21:52:24 +0800 Subject: [PATCH 26/35] auto commit --- Go/source/main.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Go/source/main.go b/Go/source/main.go index 086742b..e18dd42 100644 --- a/Go/source/main.go +++ b/Go/source/main.go @@ -4,7 +4,6 @@ import ( "C" "fmt" "time" - "unsafe" "yitidgen/idgen" "yitidgen/regworkerid" ) @@ -27,10 +26,11 @@ func RegisterOne(ip *C.char, port int32, password *C.char, maxWorkerId int32) in } // 注册多个 WorkerId,会先注销所有本机已注册的记录 -//export RegisterMany -func RegisterMany(ip *C.char, port int32, password *C.char, maxWorkerId int32, totalCount int32) *C.int { - values := regworkerid.RegisterMany(C.GoString(ip), port, C.GoString(password), maxWorkerId, totalCount) - return (*C.int)(unsafe.Pointer(&values)) +///export RegisterMany +func RegisterMany(ip *C.char, port int32, password *C.char, maxWorkerId int32, totalCount int32) []int32 { + //values := regworkerid.RegisterMany(C.GoString(ip), port, C.GoString(password), maxWorkerId, totalCount) + //return (*C.int)(unsafe.Pointer(&values)) + return regworkerid.RegisterMany(C.GoString(ip), port, C.GoString(password), maxWorkerId, totalCount); } // 注销本机已注册的 WorkerId @@ -82,6 +82,8 @@ func main() { } } -// windows: go build -o ./target/yitidgengo.dll -buildmode=c-shared main.go -//// go install -buildmode=shared -linkshared std -//linux: go build -o ./target/yitidgengo.so -buildmode=c-shared main.go +// windows: +// go build -o ./target/yitidgengo.dll -buildmode=c-shared main.go + +// linux init: go install -buildmode=shared -linkshared std +// go build -o ./target/yitidgengo.so -buildmode=c-shared main.go From c846afe5b8fcb2e9fcfd35ae91f15ca7f3955495 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:00:16 +0800 Subject: [PATCH 27/35] auto commit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cb292a7..bf37caf 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,9 @@ QQ群:646049993 🔍 唯一ID生成器,依赖WorkerId,当业务服务需要水平无差别复制时,就要求它能自动注册全局唯一WorkerId,然后才能根据它生产唯一ID。 -🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。由于动态库文件较大,目前源码中不含编译后的 so (linux)和 dll(windows)文件。 +🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。 + +动态库下载链接:https://gitee.com/yitter/idgenerator/attach_files/662372/download/regworkerid_lib_v1.0.zip 动态库接口定义: ``` From 2637310b0a41541e3570f213f35e8bfbb6893af5 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:08:00 +0800 Subject: [PATCH 28/35] auto commit --- Tools/AutoRegisterWorkerId/README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Tools/AutoRegisterWorkerId/README.md b/Tools/AutoRegisterWorkerId/README.md index 8e57b14..5937b2f 100644 --- a/Tools/AutoRegisterWorkerId/README.md +++ b/Tools/AutoRegisterWorkerId/README.md @@ -2,15 +2,7 @@ ## AutoRegisterWorkerId -Զע WorkerId Ĺߡ¼ʹá - - -## 輯 - -ȫִһΣ - -1.Redisӡ - -2.ȡ WorkerIdֵ IdGenerator +Զע WorkerId ο +https://gitee.com/yitter/idgenerator#%E8%87%AA%E5%8A%A8%E6%B3%A8%E5%86%8Cworkerid From 15b47b1e8c76c6171558a18c889dbca8c5bcb709 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:10:46 +0800 Subject: [PATCH 29/35] auto commit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bf37caf..efbbe3d 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,10 @@ QQ群:646049993 动态库接口定义: ``` // 注册一个 WorkerId,会先注销所有本机已注册的记录 +// ip: redis 服务器地址 +// port: redis 端口 +// password: redis 访问密码,可为空字符串“” +// maxWorkerId: 最大 WorkerId extern __declspec(dllexport) GoInt32 RegisterOne(char* ip, GoInt32 port, char* password, GoInt32 maxWorkerId); // 注销本机已注册的 WorkerId From d2e701d89fe3c32143c3a95aa23996020abc7f80 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:46:55 +0800 Subject: [PATCH 30/35] auto commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index efbbe3d..d30af13 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,8 @@ redis作用 🔎 在集成“自动注册WorkerId”功能时,用于注册 WorkerId ,不用于生产 ID。 +🔎 通过redis注册WorkerId,并不是唯一的方法。你也可以自己开发一个配置中心服务,各个应用终端通过配置中心获取唯一WorkerId。 + ## 💎 已实现的语言 From 39b80160871f155e9b92ec09022c419dea0cf4ba Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:54:54 +0800 Subject: [PATCH 31/35] auto commit --- README.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d30af13..96f91dc 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,10 @@ QQ群:646049993 🔍 唯一ID生成器,依赖WorkerId,当业务服务需要水平无差别复制时,就要求它能自动注册全局唯一WorkerId,然后才能根据它生产唯一ID。 -🔍 本算法提供一个开源的动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。 +🔍 本算法提供一个开源动态库(go语言实现),能在容器 k8s(或其它容器化集群) 环境下,通过 redis 自动注册 WorkerId。 + +🔍 通过redis注册WorkerId,并不是唯一的方法。你也可以自己开发一个配置中心服务,各个应用服务启动时,通过配置中心获取唯一 WorkerId。 + 动态库下载链接:https://gitee.com/yitter/idgenerator/attach_files/662372/download/regworkerid_lib_v1.0.zip @@ -213,13 +216,6 @@ extern __declspec(dllexport) void UnRegister(); extern __declspec(dllexport) GoInt32 Validate(GoInt32 workerId); ``` -redis作用 - -🔎 在集成“自动注册WorkerId”功能时,用于注册 WorkerId ,不用于生产 ID。 - -🔎 通过redis注册WorkerId,并不是唯一的方法。你也可以自己开发一个配置中心服务,各个应用终端通过配置中心获取唯一WorkerId。 - - ## 💎 已实现的语言 | 语言 | github | gitee | From 6cab1f01053973780a9360b2b91449200ea80739 Mon Sep 17 00:00:00 2001 From: yitter Date: Tue, 6 Apr 2021 22:56:42 +0800 Subject: [PATCH 32/35] auto commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 96f91dc..882281c 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,8 @@ QQ群:646049993 🔍 通过redis注册WorkerId,并不是唯一的方法。你也可以自己开发一个配置中心服务,各个应用服务启动时,通过配置中心获取唯一 WorkerId。 +🔍 当然,如果你的服务不需要自动扩展,你就不必自动注册WorkerId,而是为每个应用手工设定一个唯一值。 + 动态库下载链接:https://gitee.com/yitter/idgenerator/attach_files/662372/download/regworkerid_lib_v1.0.zip From bfa1e8c5df84e24784937ae7937af7695c145c97 Mon Sep 17 00:00:00 2001 From: yitter Date: Wed, 7 Apr 2021 00:41:35 +0800 Subject: [PATCH 33/35] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 882281c..22c5b64 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ QQ群:646049993 ***WorkerIdBitLength***,机器码位长,决定 WorkerId 的最大值,默认值6,取值范围 [1, 19],实际上有些语言采用 无符号ushort(uint16) 类型接收该参数,所以最大值是16,如果是采用有符号short(int16),则最大值为15。 - ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用不能相同,本算法提供一个通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 + ***WorkerId***,机器码,无默认值,必须由外部设定,最大值 2^WorkerIdBitLength-1(实际上根据语言的实现不同可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 的规则)。不同机器或不同应用实例不可相同,你可通过应用程序配置该值,也可通过调用外部服务获取值。针对自动注册WorkerId需求,本算法提供默认实现:通过 redis 自动注册 WorkerId 的动态库,详见“Tools\AutoRegisterWorkerId”。 ***SeqBitLength***,序列数位长,默认值6,取值范围 [3, 21](建议不小于4),决定每毫秒生成的 ID 个数。规则要求:WorkerIdBitLength + SeqBitLength 不超过 22。 From 2d8a87bac694da9722d92521673bd253e733d482 Mon Sep 17 00:00:00 2001 From: yitter Date: Wed, 7 Apr 2021 00:53:19 +0800 Subject: [PATCH 34/35] auto commit --- C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs index 2c0ffcf..dc91a05 100644 --- a/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs +++ b/C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM1.cs @@ -236,6 +236,8 @@ namespace Yitter.IdGenerator { EndOverCostAction(currentTimeTick); + // TODO: 在漂移终止,等待时间对齐时,如果发生时间回拨较长,则此处可能等待较长时间。可优化为:在漂移终止时增加时间回拨应对逻辑。(该情况发生概率很低) + _LastTimeTick = GetNextTimeTick(); _CurrentSeqNumber = MinSeqNumber; _IsOverCost = false; From ebf2fd0756318c6bdeb8b1eb8f642e136e5aa316 Mon Sep 17 00:00:00 2001 From: yitter Date: Wed, 7 Apr 2021 09:55:33 +0800 Subject: [PATCH 35/35] auto commit --- Tools/AutoRegisterWorkerId/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/AutoRegisterWorkerId/README.md b/Tools/AutoRegisterWorkerId/README.md index 5937b2f..cc995e9 100644 --- a/Tools/AutoRegisterWorkerId/README.md +++ b/Tools/AutoRegisterWorkerId/README.md @@ -1,8 +1,8 @@ -# idgenerator +# idgenerator -## AutoRegisterWorkerId +## 关于AutoRegisterWorkerId -Զע WorkerId ο +自动注册 WorkerId 参考: https://gitee.com/yitter/idgenerator#%E8%87%AA%E5%8A%A8%E6%B3%A8%E5%86%8Cworkerid