`

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

阅读更多
先看引文:
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');
   }
}

0
3
分享到:
评论
2 楼 王新春 2016-03-08  
rekoe.net 写道
咋用?能把调用方式也提供一下么

generate  方法就可以吧
1 楼 rekoe.net 2016-03-07  
咋用?能把调用方式也提供一下么

相关推荐

    分布式ID生成策略_snowflake算法

    Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...

    细聊分布式ID生成方法.pdf

    为了更清晰地展示分布式ID生成的具体实现方式,以下列举了几种典型的方法。 ##### 4.1 数据库自增ID 利用数据库提供的自增功能是一种简单有效的解决方案。例如,MySQL提供了`AUTO_INCREMENT`属性,可以自动为表中...

    java 分布式 代码生成器 唯一ID

    结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...

    细聊分布式ID生成方法

    总结,选择哪种分布式ID生成方法取决于业务场景的具体需求,如系统的并发量、趋势有序性的要求、可用性和扩展性等。常见的方法各有优劣,可以根据实际情况权衡选择。例如,如果对ID趋势有序性要求较高,可以考虑使用...

    百度开源的分布式 ID 生成器,太强大了!(csdn)————程序.pdf

    《深入理解百度开源的分布式ID生成器UidGenerator》 在分布式系统中,生成全局唯一ID是一个常见的需求,而百度开源的UidGenerator就是这样一款强大的工具。它基于Snowflake模型,为系统提供了高性能且具有唯一性的...

    Go-GolangMysql实现的分布式ID生成服务

    本篇文章将详细探讨如何使用Go和MySQL来实现一个分布式ID生成服务。 ### 1. 分布式ID的重要性 在大规模分布式系统中,为了保证数据的一致性和避免冲突,每个新生成的ID必须是全局唯一的。传统的递增ID在多节点环境...

    分布式id生成器.zip

    Vesta,uidgennator等分布式id生成方案 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境...

    分布式ID生成策略(1)_snowflake算法

    在提供的压缩包文件中,"分布式ID生成策略(1)_snowflake算法.pdf"可能是详细讲解Snowflake算法的文档,可以进一步学习了解其原理和实现细节。其他如".classpath"、".gitignore"、".project"、"pom.xml"等文件是Java...

    分布式id生成详解.pdf

    分布式ID生成是现代互联网系统中不可或缺的一个环节,它在各种业务场景中起到标识唯一对象的作用。为了满足分布式环境的需求,生成的ID需要具备以下几个关键特性: 1. 唯一性:确保每个ID在全球范围内都是独一无二...

    通用、灵活、高性能的分布式 ID 生成器

    本文将深入探讨“通用、灵活、高性能”的分布式ID生成器的设计原理、实现方式以及它在服务器应用和分布式服务/框架中的应用。 首先,让我们理解什么是分布式ID。在传统的单体应用中,我们可以通过自增ID或者数据库...

    Twitter的分布式自增ID雪花算法snowflake

    综上所述,Twitter的雪花算法(Snowflake)提供了一种高效、简单的分布式ID生成方案,通过合理的结构设计,确保了全局唯一性和顺序性。在Java环境下,可以通过实现相应的类和方法轻松地引入这一机制,为分布式系统的...

    分布式ID生成算法 - 雪花算法SnowFlake,不重复

    时间戳必须大于上一次生成ID的时间戳. 如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加, 为了保证尾数随机性更大一些,最后一位可以设置一个随机数 防止产生的时间比之前的...

    美团双buffer分布式ID生成系统

    美团的双buffer分布式ID生成系统基于Twitter的Snowflake算法进行改良,核心思想是将ID分为多个部分,如时间戳、工作机器ID和序列号。双buffer的设计主要是为了提高系统的稳定性和可用性,具体如下: 1. **时间戳**...

    迄今为止最全面的分布式主键ID生成器,多语言新雪花算法(SnowFlake IdGenerator).zip

    迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...

    snowflake-C语言实现分布式自增有序的唯一ID生成算法

    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碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右

    分布式ID生成器的解决方案总结.docx

    分布式ID生成器是大型互联网系统中不可或缺的一部分,其主要任务是为系统中的各种实体生成全局唯一的标识符(ID)。在复杂分布式环境下,选择合适的ID生成策略对于系统的性能、可用性和可扩展性至关重要。以下是几种...

    分布式ID生成器解决方案SnowflakeX.docx

    本文将深入探讨一种名为SnowflakeX的分布式ID生成解决方案,它是在原始Snowflake算法基础上进行了改进,增加了时间回拨保护机制,以防止时间异常导致的ID重复。 首先,我们了解下为什么需要ID生成器。当数据库进行...

    分布式ID生成

    针对以上几种方法存在的问题,可以借鉴Twitter的Snowflake算法思想,结合具体的业务场景和并发量需求,设计出适用于特定环境的分布式ID生成方案。Snowflake算法的核心思路是: - **时间戳**:占41位,用来表示ID...

Global site tag (gtag.js) - Google Analytics