细聊分布式ID生成方法的实现(一个可以使用10年的序列生成器)
2016-03-05 00:00
771 查看
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');
}
}
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');
}
}
相关文章推荐
- 开发者需要知道的iOS 8 SDK新特性
- 远程推送IOS
- NSString属性什么时候用copy,什么时候用strong?
- OC高效率52之理解引用计数
- 创业的第一百三十六天
- Java中的浅拷贝与深拷贝
- svn cleanup 失败 svn cleanup failed–previous opera..
- druid错误解决办法
- Druid连接池简单入门配置
- 使用zookeeper实现服务路由和负载均衡
- 文件下载
- ios 微信朋友圈 开发技术分析
- day05 mysql基础
- Unity 摄像机旋转初探
- 关于状态栏的颜色/状态修改
- 从零开始(1)
- 字符串NSStirng和NSData,Byte,十六进制之间的相互转换
- vmware虚拟机怎么克隆
- 10大渗透测试系统DVWA
- linux grep命令详解