分布式ID生成方法的实现(类Snowflake)

先看引文:
[url]http://www.tuicool.com/articles/F7veqq[/url]

原文的部分:
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');
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值