先看引文:
http://www.tuicool.com/articles/F7veqq
原文的部分:
Snowflake是twitter开源的一款独立的适用于分布式环境的ID生成服务器。
前41bits是以微秒为单位的timestamp。
接着10bits是事先配置好的机器ID。
最后12bits是累加计数器。
我的类似实现思路(不完全和上面的要求一样的):
package com.gym.core.common;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang.StringUtils;
import com.gym.core.date.DateContants.DateFormatType;
import com.gym.core.date.DateParseUtils;
/**
*
* @author wangxinchun1988@163.com
* @date 2016-3-5 下午3:04:41
*/
public class SequenceIdGenerateUtils {
private static final long BEGIN_DATE = DateParseUtils.convertDate("2016-01-01", DateFormatType.YYYY_MM_DD).getTime();
private static final int localMachineAppend = Integer.parseInt(DnsUtil.getHostAddress().split("\\.")[3]);
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static long generate(int businessType){
StringBuilder binaryStr = new StringBuilder("0");
binaryStr.append(wrapTimeBinaryStr());
binaryStr.append(wrapBusinessBinaryStr(businessType));
binaryStr.append(wrapRoomBinaryStr(1));
binaryStr.append(wrapMachineBinaryStr(localMachineAppend));
binaryStr.append(wrapSequencePeyMachine());
return Long.parseLong(binaryStr.toString(), 2);
}
/**
* 39 bit */
private static String wrapTimeBinaryStr(){
long currentTime = System.currentTimeMillis();
long timeElipse = currentTime - BEGIN_DATE;
return StringUtils.leftPad(Long.toBinaryString(timeElipse),39,'0');
}
/**
* 10 bit
*/
private static String wrapMachineBinaryStr(int machineIp){
return StringUtils.leftPad(Integer.toBinaryString(machineIp), 10, '0');
}
/**
* 5 bit
*/
private static String wrapBusinessBinaryStr(int businessType){
return StringUtils.leftPad(Integer.toBinaryString(businessType), 5, '0');
}
/**
* 4 bit
*/
private static String wrapRoomBinaryStr(int room){
return StringUtils.leftPad(Integer.toBinaryString(room), 4, '0');
}
/**
* 5 bit
*/
private static String wrapSequencePeyMachine(){
if(atomicInteger.get() == Integer.MAX_VALUE){
atomicInteger = new AtomicInteger();
}
return StringUtils.leftPad(Integer.toBinaryString(atomicInteger.incrementAndGet() % 32), 5,'0');
}
}
分享到:
相关推荐
分布式ID生成,主键生成,Java实现的snowflake算法
Vesta,uidgennator等分布式id生成方案 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境...
分布式ID生成,主键生成策略,snowflake算法,采用java实现。
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
We have retired the initial release of Snowflake and working on open sourcing the next version based on Twitter-server, in a form that can run anywhere without requiring Twitter's own infrastructure ...
分布式ID生成,雪花算法生成唯一ID工具类。该工具类线程安全。 整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右
使用 snowflake 生成 UUID 很多都是在分布式场景下使用,我看了下网上有其中有几篇 PHP 实现的都没有考虑到线程安全。现在 PHP 有了 Swoole 的锁和协程的加持,对于我们开发线程安全和高并发模拟还是很方便的,这里...
借鉴snowflake的思想,结合各公司的业务逻辑和并发量,可以实现自己的分布式ID生成算法
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
nodejs-snowflake是一种快速可靠的方法,可以为分布式系统生成时间可排序的64位ID。 主要的ID生成功能是使用N-API用C ++编写的,这使得ID生成的过程非常快。 使用C ++进行id生成还可以确保生成的数字大小为64位。 ...
迄今为止最全面的分布式主键ID生成器。优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
分布式系统,全局唯一ID,高效,永不重复。相比较uuid,雪花id是按照时间有序生成的,方便sql优化
雪花算法分布式ID生成器 该项目的目的是提供一个轻量级、高并发、高可用的生成唯一ID的服务,生成的ID是一个64位的 长整型,全局唯一,保持递增,相对有序。基于twitter的雪花算法来生成ID,用于取代UUID那种无序、...
最近项目需要解决高并发分布式生成唯一ID值的问题,经过考虑,采用Snowflake算法,该算法是一个很有效的办法,具体的可以自己百度,这里是基于thinkPHP5 开发的通用的生成器,其实也是参考了网上的方法,只是增加了...
本分布式主键ID生成器基于多语言优化,包含204个文件,包括Markdown文档、Dockerfile、Go源代码、Java源代码、GIT忽略文件、Header文件、C#源代码、C源代码、Pascal源代码、Rust源代码。系统采用优化的雪花算法...
最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、...
idworker-基于zookeeper,snowflake的分布式统一ID生成工具 是什么 idworker是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和...
背景 主键(主键),用于唯一标识表中的每一条数据。所以,一个合格的主键的最...分布式场景唯一。 跨合并服务器数据合并方便。 缺点如下: 存储空间占用阻力。 无序,涉及到排序的场景下性能较差。 GUID最大的缺点
而twitter的snowflake解决了这种需求,最初是Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序的ID生成机制,所以开发了这样一套唯一的ID生成服务。结构雪花的结构如下(每部分用-分开): 0 - ...