Twitter Snowflake 的Java实现
在关闭显示的情况下, 可以达到每毫秒3万个的生成速度
/** * An Implementation of Twitter Snowflake ID Generator */ public class SnowflakeId { private final static long EPOCH = 0L; // shift for smaller timestamp private final static long DEVICE_ID_BITS = 2L; private final static long SEQUENCE_BITS = 16L; private final static long MAX_WORKER_ID = -1L ^ -1L << DEVICE_ID_BITS; // 与& 非~ 或| 异或^, only the bit on WORKER_ID_BITS are 1 private final static int SEQUENCE_MASK = (int)(-1L ^ -1L << SEQUENCE_BITS); private final long deviceId; private final RecyclableAtomicInteger atomic = new RecyclableAtomicInteger(); private long lastTimestamp = -1L; public SnowflakeId(final long deviceId) { if (deviceId > MAX_WORKER_ID || deviceId < 0) { throw new IllegalArgumentException( String.format("Device ID should be between 0 and %d", this.MAX_WORKER_ID)); } this.deviceId = deviceId; } public long nextId() { long timestamp = millisecond(); if (timestamp < lastTimestamp) { throw new IllegalArgumentException( String.format("Wait %d milliseconds", lastTimestamp - timestamp)); } if (lastTimestamp == timestamp) { int sequence = atomic.incrementAndRecycle(SEQUENCE_MASK); if (sequence == 0) { timestamp = waitTilNextMillis(lastTimestamp); lastTimestamp = timestamp; } return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS) | sequence; } else { atomic.set(0); lastTimestamp = timestamp; return (timestamp - EPOCH << (SEQUENCE_BITS + DEVICE_ID_BITS)) | (deviceId << SEQUENCE_BITS); } } private long waitTilNextMillis(final long lastTimestamp) { System.out.print(lastTimestamp); long timestamp; for (;;) { timestamp = this.millisecond(); System.out.print('+'); if (timestamp > lastTimestamp) { System.out.print("\n"); return timestamp; } } } private long millisecond() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowflakeId worker = new SnowflakeId(1); long start = System.currentTimeMillis(); for (int i = 0; i < 5000000; i ++) { //System.out.println(worker.nextId()); worker.nextId(); } long duration = System.currentTimeMillis() - start; System.out.println("Total: " + duration + "ms, " + 5000000/duration + "/ms"); } }
分类:
Java
, General Programming
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程