SnowFlake雪花演算法生成分布式id

2021-09-12 14:57:27 字數 1893 閱讀 5733

author :twitter

/**

* 雪花演算法snowflake

* created on 2019/3/14.

* * @author twitter

*/public class idsnowflake

/*** 起始的時間戳

*/private final static long start_stmp = 1480166465631l;

/*** 每一部分占用的位數,序列號占用的位數

*/private final static long sequence_bit = 12;

/*** 機器標識占用的位數

*/private final static long machine_bit = 5;

/*** 資料中心占用的位數

*/private final static long datacenter_bit = 5;

/*** 每一部分的最大值

*/private final static long max_datacenter_num = -1l ^ (-1l << datacenter_bit);

private final static long max_machine_num = -1l ^ (-1l << machine_bit);

private final static long max_sequence = -1l ^ (-1l << sequence_bit);

/*** 每一部分向左的位移

*/private final static long machine_left = sequence_bit;

private final static long datacenter_left = sequence_bit + machine_bit;

private final static long timestmp_left = datacenter_left + datacenter_bit;

/*** 資料中心

*/private long datacenterid;

/*** 機器標識

*/private long machineid;

/*** 序列號

*/private long sequence = 0l;

/*** 上一次時間戳

*/private long laststmp = -1l;

public idsnowflake(long datacenterid, long machineid)

if (machineid > max_machine_num || machineid < 0)

this.datacenterid = datacenterid;

this.machineid = machineid;

}public idsnowflake()

/*** 產生下乙個id

** @return

*/public synchronized long nextid()

if (currstmp == laststmp)

} else

laststmp = currstmp;

// 時間戳部分 + 資料中心部分 + 機器標識部分 + 序列號部分

return (currstmp - start_stmp) << timestmp_left

| datacenterid << datacenter_left

| machineid << machine_left

| sequence;

}private long getnextmill()

return mill;

}private long getnewstmp()

}

雪花演算法 snowflake

分布式系統中,有一些需要使用全域性唯一id的場景,這種時候為了防止id衝突可以使用36位的uuid,但是uuid有一些缺點,首先他相對比較長,另外uuid一般是無序的。有些時候我們希望能使用一種簡單一些的id,並且希望id能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初...

SnowFlake 雪花演算法

首先雪花演算法就是生成乙個64位的二進位制資料,最終轉換成長度為19的十進位制正整數整型資料 0 0000000000 0000000000 0000000000 0000000000 0 00000 00000 000000000000解釋一下這64位分別代表什麼意思,從左往右。當然這個演算法的強...

雪花(SnowFlake)演算法學習

class customsnowflake if workerid maxworkerid workerid 0 this.datacenterid datacenterid this.workerid workerid public synchronized long nextid 檢視時間是否在...