基于snowflake的ID生成器
来源:互联网 发布:网店数据分析毕业论文 编辑:程序博客网 时间:2024/06/06 01:25
/** * 基于snowflake的ID生成器 * @author farrellz * @date 2016年9月27日 */public class IDGenerator {private final long twepoch = 1288834974657L;private final long workerIdBits = 5L;private final long datacenterIdBits = 5L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);private final long sequenceBits = 12L;private final long workerIdShift = sequenceBits;private final long datacenterIdShift = sequenceBits + workerIdBits;private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final long sequenceMask = -1L ^ (-1L << sequenceBits);private long workerId;private long datacenterId;private long sequence = 0L;private long lastTimestamp = -1L;public String gen() {return nextId() + "";}public IDGenerator() {this(0, 0);}public IDGenerator(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence;}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}public static void main(String[] args) {IDGenerator idWorker = new IDGenerator();for (int i = 0; i < 1000; i++) {String id = idWorker.gen();System.out.println(id);}}}
3 0
- 基于snowflake的ID生成器
- UidGenerator:百度出品的基于 Snowflake 算法的唯一 ID 生成器(Java)
- UidGenerator:百度出品的基于 Snowflake 算法的唯一 ID 生成器
- 基于Twitter的snowflake算法生成ID
- 分布式唯一ID生成器Twitter 的 Snowflake idworker java版本
- java分布式id获取,基于twiter的snowflake
- 基于redis的分布式ID生成器
- 基于redis的分布式ID生成器
- 基于业务对Twitter生成全局唯一ID的SnowFlake算法的改造
- hibernate的ID生成器
- Hibernate的ID标识符生成器
- Hibernate的ID标识符生成器
- Twitter的分布式自增ID算法snowflake (Java版)
- Twitter的分布式自增ID算法snowflake
- Twitter的分布式自增ID算法snowflake - C#版
- Twitter的分布式自增ID算法snowflake (Java版)
- Twitter的分布式自增ID算法snowflake
- Twitter的分布式自增ID算法snowflake (Java版)
- Leetcode之Longest Valid Parentheses
- Symfony2一级目录结构
- C++每日一练(多重继承)
- C++输入日期判断是星期几
- 「枫桥夜泊」一诗
- 基于snowflake的ID生成器
- SurfaceView中lockCanvas返回值为null
- 启动模式
- android viewpager引导页+圆点详解
- SDL2.0配置说明
- python 报错:unexpected indent
- WPF学习笔记:(二)数据绑定模式与INotifyPropertyChanged接口
- C# Types
- TC怎么接入百宝云注册码系统V2