From 77cdd83a5e23b2966b1d8bc3d6081c044a7d708d Mon Sep 17 00:00:00 2001 From: askuy Date: Sat, 16 Nov 2024 22:37:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 861b199..fc12391 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,62 @@ # esnowflake +## 背景 +雪花算法是64位的,需要有个workId,而这个workId,在k8s下处理起来会非常麻烦。而我们不需要非常小的数字存储,所以我们可以考虑使用128位的雪花算法。这样我们就可以不需要workId,而直接使用pod的ip地址来生成一个128位的id。 -experimental +有两种128位的雪花算法。 + +### 全随机的 +``` +/* +Random +* 1 41 65 128 +* +---------------------------------------------+----------------------------+--------------------------------------------------------------------------+ +* | timestamp(ms) | worker info | random number | +* +---------------------------------------------+----------------------------+--------------------------------------------------------------------------+ +* | 00000000 00000000 00000000 00000000 00000000 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00000000 00000000 00000000 | 00000000 00000000 | +* +---------------------------------------------+----------------------------+--------------------------------------------------------------------------+ +* +* 1. 40 位时间截(毫秒级),注意这是时间截的差值(当前时间截 - 开始时间截)。可以使用约 34 年: (1L << 40) / (1000L * 60 * 60 * 24 * 365) = 34。(2020-2054) +* 2. 24 位 worker info 数据,适应 k8s 环境。 +* 3. 64 随机数 +*/ +``` +```go +// New create a new snowflake node with a unique worker id. +// ip 你的机器 ip +// mask1, mask2, mask3 你自己填的随机数,用于混淆 ip +obj := New("192.168.1.1", 1, 2, 3) +id := obj.GenerateByRandom() +fmt.Println(id) +fmt.Println(obj.GetTime(id)) +fmt.Println(obj.GetIp(id)) +``` + + + +### 带序列号的 +``` +/* +Sequence +* 1 41 65 113 128 +* +---------------------------------------------+----------------------------+------------------------------------------------------+-------------------+ +* | timestamp(ms) | worker info | random number | sequence | +* +---------------------------------------------+----------------------------+------------------------------------------------------+-------------------+ +* | 00000000 00000000 00000000 00000000 00000000 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00000000 00000000 00000000 | 00000000 00000000 | +* +---------------------------------------------+----------------------------+------------------------------------------------------+-------------------+ +* +* 1. 40 位时间截(毫秒级),注意这是时间截的差值(当前时间截 - 开始时间截)。可以使用约 34 年: (1L << 40) / (1000L * 60 * 60 * 24 * 365) = 34。(2020-2054) +* 2. 24 位 worker info 数据,适应 k8s 环境。 +* 3. 48 随机数 +* 4. 16 位 sequence +*/ +``` +```go +// New create a new snowflake node with a unique worker id. +// ip 你的机器 ip +// mask1, mask2, mask3 你自己填的随机数,用于混淆 ip +obj := New("192.168.1.1", 1, 2, 3) +id := obj.GenerateBySequence() +fmt.Println(id) +fmt.Println(obj.GetTime(id)) +fmt.Println(obj.GetIp(id)) +``` \ No newline at end of file