Giter Site home page Giter Site logo

snowflake's Introduction

SnowFlake

Twitter的雪花算法SnowFlake,使用Java语言实现。

SnowFlake算法用来生成64位的ID,刚好可以用long整型存储,能够用于分布式系统中生产唯一的ID, 并且生成的ID有大致的顺序。 在这次实现中,生成的64位ID可以分成5个部分:

0 - 41位时间戳 - 5位数据中心标识 - 5位机器标识 - 12位序列号

5位数据中心标识跟5位机器标识这样的分配仅仅是当前实现中分配的,如果业务有其实的需要,可以按其它的分配比例分配,如10位机器标识,不需要数据中心标识。

具体说明可以参考文章: http://www.wolfbe.com/detail/201611/381.html

生成的ID如下所示:

2099698216983

2099698216984

2099698216985

2099698216986

2099698216987

2099698216988

2099698216989

2099698216990

2099698216991

2099698216992

2099698216993

2099698216994

2099698216995

2099698216996

2099698216997

2099698216998

2099698216999

2099698217000

2099698217001

2099698217002

2099698217003

2099698217004

2099698217005

2099698217006

2099698217007

2099698217008

2099698217009

2099698217010

2099698217011

2099698217012

2099698217013

2099698217014

2099698217015

2099698217016

2099698217017

2099698217018

2099698217019

赞助

如果觉得项目还不错,想要表达些什么的话,可以上爱淘汇:http://itao.wolfbe.com 领淘宝天猫的优惠券,领取优惠券再下单可以省不少钱喔。你们使用这些优惠券购买东西时,我也可以得到一些佣金的,多谢支持!!!

snowflake's People

Contributors

beyondfengyu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

snowflake's Issues

多线程测试有重复序列号

public class SnowFlakeKeyTest2 {
private static Set keys = new HashSet();
public static void main(String[] args) throws Exception {
for(int i=0;i<100;i++) {
SnowFlakeKeyTest2.GetKey runner = new SnowFlakeKeyTest2().new GetKey();
new Thread (runner).start();;
}
System.out.println(keys);

}

class GetKey implements Runnable{

	@Override
	public void run() {
		SnowFlake key = new SnowFlake(30,20);
		long k = key.nextId();
		if(!keys.contains(k)) {
			keys.add(k);
		}else {
			System.out.println("重复:"+k);
		}
	}
}

}

运行结果,有很多重复

重复:329755153370267648
重复:329755153370267648
重复:329755153370267648
重复:329755153370267648
重复:329755153374461952
重复:329755153374461952
重复:329755153374461952
重复:329755153374461952
重复:329755153378656256
重复:329755153378656256
重复:329755153378656256
重复:329755153378656256
重复:329755153382850560
重复:329755153391239168
重复:329755153391239168
重复:329755153391239168
重复:329755153391239168
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153399627776
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153395433472
重复:329755153403822080
重复:329755153412210688
重复:329755153412210688
重复:329755153412210688
重复:329755153420599296
重复:329755153420599296
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153424793600
重复:329755153433182208
[329755153424793600, 329755153433182208, 329755153403822080, 329755153370267648, 329755153374461952, 329755153378656256, 329755153382850560, 329755153391239168, 329755153395433472, 329755153399627776, 329755153408016384, 329755153412210688, 329755153420599296, 329755153428987904]
重复:329755153433182208
重复:329755153433182208
重复:329755153433182208
重复:329755153433182208
重复:329755153433182208
重复:329755153433182208
重复:329755153437376512
重复:329755153437376512
重复:329755153437376512
重复:329755153437376512
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153441570816
重复:329755153445765120
重复:329755153445765120

id in binary is 60 bits in length, not 64

My generated snowflake id is like 541575807856234496. its binary is 11110000100000100000101001111101110001101110101000000000000 which is 60 bits. i think it should be 64 in length. What's wrong?

时间戳的问题

如果时间戳的时间是2028年 ,1847071126000
生成出来的ID就是负数了,-1323802375361658781

每一部分的最大值这里感觉存在问题

private static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT)

这里假设 SEQUENCE_BIT = 3;结果是 7。
但不应该是 2^3 = 8 吗?
为什么不直接是:
private static final long MAX_SEQUENCE = 1L << SEQUENCE_BIT
不知道有什么其它考量吗?

多线程情况下有ID值重复

public static void main(String[] args) {
SnowFlake snowFlake = new SnowFlake(2, 3);

    for (int i = 0; i < 8000; i++) {
        Thread thread = new Thread() {
            public void run() {
                // 测试情况下会有重复id出现
                ystem.out.println(snowFlake.nextId());
            }
        };
        thread.start();
    }

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.