基於twitter的雪花演算法生成不重複id

2021-08-08 09:11:49 字數 2247 閱讀 6769

一、簡介

在很多業務場景中,在單台機器或者由多台機器構成的分布式場景中,我們需要生成全域性唯一的id。

在這裡,將介紹基於twitter的雪花演算法,生成全域性的、唯一的、基於時間排序的、基本有序的id生成方法。

二、twitter雪花演算法的原理

twitter的雪花演算法,是將id按二進位制位元位切割,不同的位區間,表示不同的含義,也即是不同位區間

的值生成方式不同,從而生成唯一的id。

如位區間可分為時間位區間、集群位區間、機器位區間、自增位區間,這樣可在不同時間內、不同集群、

不同機器間,生成全域性唯一的id。

三、twitter雪花演算法的例項

在此以生成64位(即long型)為例進行介紹(其實區間位可以根據具體的業務需要自行指定)。

1、位區間化分

最高位(即第64位,從右向左數)為符號位,不使用;

41位(第23位到第63位)為時間位,可使用個數為2199023255551個,以毫秒為單位,大約69.5年;

5位(第18位到第22位)為集群位,可使用個數為32個;

5位(第13位到第17位)為機器位,可使用個數為32個;

12位(第1位到第12位)為序列號位,即是從0開始自增,可使用個數為4096個;

2、確定時間位開始計算的時間點

本例以2017-10-12 00:00:00開始計時,那麼過去掉的時間(從1970-01-01 00:00:00開始)的毫秒數

為1507737600000,取時間時需要減去這段時間。

四、**例項

/**

* 採用twitter的雪花演算法,生成有一定順序且不重複的id,結果型別為64位的long型

*/public class snowflakeidgen

/*** 指定集群id和機器id**

@param

datacenterid

*@param

workerid

*/public

snowflakeidgen(long datacenterid, long workerid)

if (workerid < 0 || workerid > maxworkerid)

this.datacenterid = datacenterid;

this.workerid = workerid;

} /**

* 生成全域性唯一的id**

@return

*/public synchronized long

nextid()

//同一時刻生成的id號

if (timestamp == lasttimestamp)

} else

lasttimestamp = timestamp;

long id = ((timestamp - pastmills) << timestampshiftbits)

| (datacenterid

<< datacenteridshiftbits)

| (workerid

<< workeridshiftbits)

| sequenceid

;return id;

} /**

* 獲取上次取數毫秒的下一時刻**

@param

lasttimestamp

*@return

*/long

nexttimestamp(long lasttimestamp)

return timestamp;

} public static void

main(string args) throws exception

}}

結果輸出:

330918199820288

330918199820289

330918199820290

330918199820291

330918199820292

330918199820293

330918199820294

330918199820295

330918199820296

330918199820297

生成基於雪花演算法的隨機編號

class snowflake static function randnumstr length return password 生成基於雪花演算法的隨機編號 author shiva param int datacenterid 資料中心id 0 31 param int workerid 任務...

雪花演算法(03)生成時間

前面的理論基礎和位運算都了解了,下面我們來生成雪花演算法的第一部分,也就是時間部分。時間部分的邏輯起始很簡單,就是規定乙個起始時間戳,然後用當前時間戳減去起始時間戳,這兩個數的差就是我們要的結果。簡單看一下 邏輯 我們規定的起始時間是 2015 01 01 00 00 00 然後獲取當前時間,用當前...

基於雪花演算法生成64位ID

import logging import time class generator object 64位id 1 符號位不用 41 毫秒 4 機器id 6 業務編碼 12 重複累加 基礎時間 毫秒 1577808000000 2020 01 01 00 00 最大支援時間差 21990232555...