博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Twitter的雪花算法(JAVA)
阅读量:6159 次
发布时间:2019-06-21

本文共 3558 字,大约阅读时间需要 11 分钟。

hot3.png

直接上代码(这段代码我是抄的,虽然看不懂,但是我知道能用,哈哈)

package com.example.learning.雪花算法;/** * 描述:雪花算法 * User: 曾远征 * Date: 2018-09-17 * Time: 15:51 */public class SnowflakesTools {    //开始时间截 (2015-01-01)    private final long twepoch = 1489111610226L;    //机器ID所占位置    private final long workerIdBits = 5L;    //数据标识所占位数    private final long datacenterIdBits = 5L;    //支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);    //支持的最大数据标识id,结果是31    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);    //序列在id中占的位数    private final long sequenceBits = 12L;    //机器ID向左移12位    private final long workerIdShift = sequenceBits;    //数据标识id向左移17位(12+5)    private final long datacenterIdShift = sequenceBits + workerIdBits;    //时间截向左移22位(5+5+12)    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;    //生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)    private final long sequenceMask = -1L ^ (-1L << sequenceBits);    //工作机器ID(0~31)    private long workerId;    //数据中心ID(0~31)    private long datacenterId;    //毫秒内序列(0~4095)    private long sequence = 0L;    //上次生成ID的时间截    private long lastTimestamp = -1L;    public SnowflakesTools(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;    }    /**     * 获得下一个ID (该方法是线程安全的)     * @return     */    public synchronized long nextId() {        long timestamp = timeGen();        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常        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;        }        //上次生成ID的时间截        lastTimestamp = timestamp;        //移位并通过或运算拼到一起组成64位的ID        return ((timestamp - twepoch) << timestampLeftShift)                | (datacenterId << datacenterIdShift)                | (workerId << workerIdShift)                | sequence;    }    /**     * 阻塞到下一个毫秒,直到获得新的时间戳     * @param lastTimestamp     * @return     */    protected long tilNextMillis(long lastTimestamp) {        long timestamp = timeGen();        while (timestamp <= lastTimestamp) {            timestamp = timeGen();        }        return timestamp;    }    /**     * 返回以毫秒为单位的当前时间     * @return     */    protected long timeGen() {        return System.currentTimeMillis();    }    public static void main(String[] args) {        SnowflakesTools idWorker = new SnowflakesTools(0, 0);        for (int i = 0; i < 1000; i++) {            long id = idWorker.nextId();            System.out.println(id);        }    }}

转载于:https://my.oschina.net/u/3194578/blog/2052442

你可能感兴趣的文章
mysql表去掉回车、换行
查看>>
修改内核配置解决busybox的mdev -s启动速度慢的问题
查看>>
Python运维-获取当前操作系统的各种信息
查看>>
Spring如何处理线程并发
查看>>
linux常用命令(用户篇)
查看>>
获取组件的方式(方法)
查看>>
win2008 server_R2 自动关机 解决
查看>>
我的友情链接
查看>>
在C#调用C++的DLL简析(二)—— 生成托管dll
查看>>
Linux macos 常用终端操作
查看>>
企业网络的管理思路
查看>>
Linux磁盘分区与挂载
查看>>
J2se学习笔记一
查看>>
DNS视图及日志系统
查看>>
DDoS deflate–简单解决VPS被DDOS/CC攻击
查看>>
老李分享:Android性能优化之内存泄漏 3
查看>>
mysql命令
查看>>
来自极客标签10款最新设计素材-系列七
查看>>
极客技术专题【009期】:web技术开发小技巧
查看>>
PHP 简单计算器代码实现
查看>>