• 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("
    ");
                    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");
        }
    }
  • 相关阅读:
    Sql Server数据库汉字按字母、笔划、拼音首字母、排序
    产生一个int数组,长度为100,并向其中随机插入1100,并且不能重复
    使用DropDownExtender
    一些关于中文乱码问题的一些解决方案和经验和大家分享!
    (译)Silverlight教程第一部分: 使用Silverlight 2 和 VS 2008创建“Hello World”程序
    使用CalendarExtender
    .NET实现中英文验证码
    使用Accordion
    使用AlwaysVisibleControlExtender
    Javascript经典窍门
  • 原文地址:https://www.cnblogs.com/milton/p/5169890.html
Copyright © 2020-2023  润新知