细聊分布式ID生成方法的实现(一个可以使用10年的序列生成器)

  1. package com.gym.core.common;  

  2.   

  3. import java.util.concurrent.atomic.AtomicInteger;  

  4.   

  5. import org.apache.commons.lang.StringUtils;  

  6.   

  7. import com.gym.core.date.DateContants.DateFormatType;  

  8. import com.gym.core.date.DateParseUtils;  

  9.   

  10. /** 

  11.  *  

  12.  * @author [email protected] 

  13.  * @date 2016-3-5 下午3:04:41 

  14.  */  

  15. public class SequenceIdGenerateUtils {  

  16.    private static final long BEGIN_DATE = DateParseUtils.convertDate("2016-01-01", DateFormatType.YYYY_MM_DD).getTime();  

  17.    private static final int localMachineAppend = Integer.parseInt(DnsUtil.getHostAddress().split("\\.")[3]);  

  18.      

  19.    private static  AtomicInteger atomicInteger = new AtomicInteger(0);  

  20.      

  21.    public static long generate(int businessType){  

  22.        StringBuilder binaryStr = new StringBuilder("0");  

  23.         

  24.        binaryStr.append(wrapTimeBinaryStr());  

  25.        binaryStr.append(wrapBusinessBinaryStr(businessType));  

  26.          

  27.        binaryStr.append(wrapRoomBinaryStr(1));  

  28.          

  29.        binaryStr.append(wrapMachineBinaryStr(localMachineAppend));   

  30.          

  31.        binaryStr.append(wrapSequencePeyMachine());  

  32.        return Long.parseLong(binaryStr.toString(), 2);  

  33.    }  

  34.      

  35.    /** 

  36.     * 39 bit */  

  37.    private static String wrapTimeBinaryStr(){  

  38.        long currentTime = System.currentTimeMillis();  

  39.        long timeElipse = currentTime - BEGIN_DATE;  

  40.        return StringUtils.leftPad(Long.toBinaryString(timeElipse),39,'0');  

  41.    }  

  42.      

  43.    /** 

  44.     * 10 bit 

  45.     */  

  46.    private static String wrapMachineBinaryStr(int machineIp){  

  47.        return  StringUtils.leftPad(Integer.toBinaryString(machineIp), 10'0');  

  48.    }  

  49.      

  50.    /** 

  51.     * 5 bit 

  52.     */  

  53.    private static String wrapBusinessBinaryStr(int businessType){  

  54.        return  StringUtils.leftPad(Integer.toBinaryString(businessType), 5'0');  

  55.    }  

  56.      

  57.    /** 

  58.     * 4 bit 

  59.     */  

  60.    private static String wrapRoomBinaryStr(int room){  

  61.        return  StringUtils.leftPad(Integer.toBinaryString(room), 4'0');  

  62.    }  

  63.      

  64.    /** 

  65.     * 5 bit 

  66.     */  

  67.    private static String wrapSequencePeyMachine(){  

  68.        if(atomicInteger.get() == Integer.MAX_VALUE){  

  69.            atomicInteger = new AtomicInteger();  

  70.        }  

  71.        return StringUtils.leftPad(Integer.toBinaryString(atomicInteger.incrementAndGet() % 32), 5,'0');  

  72.    }  

  73. }  


你可能感兴趣的:(细聊分布式ID生成方法的实现(一个可以使用10年的序列生成器))