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 檢視時間是否在...