一、簡介
在很多業務場景中,在單台機器或者由多台機器構成的分布式場景中,我們需要生成全域性唯一的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...