雪花是怎样形成的,雪花是怎么形成的最简单答案

雪花算法SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。在分布式系统中的应用十分广泛,且ID引入了时间戳,基本上

雪花算法

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。本文主要是是实现了单机版本的算法,雪花是怎么形成的最简单答案,使用多台计算机构成分布式的ID生成服务也是可以的,预留了相关的方法参数。

应用范围

1、在jdk中自带的uuid算法可以来生成唯一性的32位字符串【拼接上‘-’之后,是36位,如:’4211210a-ba56-41b4-b70a4’】,uuid算法得到的id是无序的,而且是字符串,数据表记录多时,查询效率不高

2、基于数据库的sequnce【通过表也可以模拟sequence】来生成,在分布式系统中更新记录不方便,只能操作主表的更新。

3、雪花算法在分布式系统中可以较好地使用。

原理

把64位进行拆分,分为如下几个部份

第1部份只占1位,而且必需为0,因为最高位0表示正数。

第2部份是时间戳,占41位【为什么是41位,后面会介绍】,最多可以表示2^41,大约是69年

第3部份是产生的机器号,占10位【也可以是其它位数,不一定非得是10位,官方约定是10位】,最多可以表示2^10,相当于1024台机器,这部分可以划成两个维度,如下:

雪花的形成,主要与空气中的水汽有关。冬季气温降低到0℃以下时,空气中的水汽便在云层中凝结成小冰晶。而云层中的冰晶和过冷水滴不断碰撞蒸发,就会形成水蒸气。这些水蒸气在凝结的同时体积逐渐增大,就慢慢变成了雪花。由于。

3.1 拿5位出来做为机房号,最多可以表示 2^5个机房号,也就是最多32个机房编号

3.2 拿5位出来做为机器号,最多可以表示 2^5台电脑,也就是最多32台电脑编号

代码实现

public class IdGenerator {

//定义属性 [机器码10位,如何分配成 机房码和电脑码,做为属性,这里默认都是5]

private final long dataCenterBits = 5L; //机房码的位数

private final long computerBits = 5L; //电脑码的位数

//最后的序列码,默认从0开始

private long sequence = 0L;

//记录执行的最后时间,以毫秒为单位,默认初始化为-1L

private long lastTimeStamp = -1L;

//因为要做二进制运算,我们需要定义如下属性来记录每个部份所在的位置的偏移量

private final long sequenceBits = 12; //序号占用12位

private final long computerIdShift = sequenceBits; //电脑码的偏移量

private final long dataCenterIdShift = computerIdShift + computerBits; //机房码的偏移量

private final long timeStampShift = dataCenterIdShift + dataCenterBits; //时间戳的偏移量

//根据机房码的位数,来计算出机房码最大值

private final long MAX_COMPUTER = -1L ^ (-1L << computerBits); //同上

private final long SEQUENCE_MASK = -1L ^ (-1L << sequenceBits); // 为防止序列号溢出而准备的掩码,相当于 11111111 111

//定义属性

private long dataCenterId; //机房的id 【在分布式系统中,记录这个雪花号是由哪一个中心机房里的电脑生成的】

//构造

public IdGenerator(long computerId,long dataCenterId) {

//对参数的有效性进行判断,由于机房码和电脑码都是5位,所以,它们的值最大都不能超过31

if(computerId > MAX_COMPUTER || computerId < 0) {

throw new IllegalArgumentException(String.format(&34;,MAX_COMPUTER,0));

}

if(dataCenterId > MAX_DATA_CENTER || dataCenterId < 0) {

throw new IllegalArgumentException(String.format(&34;,MAX_DATA_CENTER,0));

}

//赋值

this.computerId = computerId;

this.dataCenterId = dataCenterId;

1、雪花是天空中的水汽经凝华而来的固态降水,结构随温度的变化而变化,一种美丽的结晶体,它在飘落过程中成团攀联在一起,就形成雪片。2、雪花是由小冰晶增大变来的,而冰的分子以六角形的为最多,因而形成雪花多是六角。

}

在混合云中,由于冰水共存使冰晶不断凝华增大,成为雪花。当云下气温低于 0℃时,雪花可以一直落到地面而形成降雪。如果云下气温高于 0℃时,则可能出现雨夹雪。雪花的形状极多,有星状、柱状、片状等等,但基本形状是六。

***************

* 核心方法,利用雪花算法来获取一个唯一性的ID

* @return

*

public synchronized long nextId() {

//1.获取当前的系统时间

long currTime = getCurrentTime();

//2. 判断是否在同一个时间内的请求

if(currTime == lastTimeStamp) {

sequence = (sequence + 1) & SEQUENCE_MASK;

//2.2 进一步判断,如果在同一个毫秒内,sequence达到了4096【1 0000 0000 0000】,则lastTime时间戳必需跳入下一个时间,因为同一个毫秒内

//sequence只能产生4096个【0-4095】,当超过时,必需跳入下一个毫秒

// 【此情况极少出现,但不可不防,这意味着1个毫秒内,JVM要执行此方法达到4096次,我这个电脑执行远达不到。】

if(sequence == 0) {

currTime = unitNextTime();

}

} else {

//如果不是与lastTime一样,则表示进入了下一个毫秒,则sequence重新计数

sequence = 0L;

}

//3. 把当前时间赋值给 lastTime,以便下一次判断是否处在同一个毫秒内

lastTimeStamp = currTime;

//4. 依次把各个部门求出来并通过逻辑或 拼接起来

return (this.lastTimeStamp << timeStampShift) | //把当前系统时间 左移22位

(this.computerId << computerIdShift) | //把计算机号编号左移 12位

雪花是怎样形成的

this.sequence; //最后的序列号占12位,无需移动

}

/******

* 等待毫秒数进入下一个时间

* @return

*

雪花是怎样形成的

private long unitNextTime() {

//1.再次获取系统时间

long timestamp = getCurrentTime();

//2. 判断 lastTime与currentTime是否一样

雪花是空中的水汽遇冷凝结成的。在一般情况下,水汽先凝成水,然后才能结冰,但雪花却是直接由水汽凝结成的(人们也把这个过程叫做凝华)。当气温降低,空中水汽变为过饱和时,就会在结晶核(如尘埃)上开始结晶,然后逐步。

雪花是怎样形成的

while(timestamp <= lastTimeStamp) {

//2.1 继续获取系统时间,直到上面的条件不成立为止

timestamp = getCurrentTime();

}

//3. 返回

return timestamp;

}

/*****

* 用来获取当前的系统时间,以毫秒为单位

* @return

*

private long getCurrentTime() {

return System.currentTimeMillis();

}

}

测试类

public class UseIdGenerator {

/****

* 主方法

* @param args

*

public static void main(String[] args) {

//这里两个参数都是1,表示1号机房和1号电脑【在分布式系统中,每个电脑知道自己所在的机房和编号】

IdGenerator ig = new IdGenerator(1,1);

//循环生成

long result = -1;

for(int i = 0;i<100000;i++) {

result = ig.nextId();

System.out.println(result+&34;+Long.toBinaryString(result));

}

}

}

上一篇 2023年01月01 01:46
下一篇 2022年12月28 23:00

相关推荐

  • word上标怎么打,论文引用怎么标注[1]右上角

    我们经常会用我的做一些数据的整理,论文引用怎么标注[1]右上角,你知道word里如何批量添加上标吗?如果你还不会的话,那么今天这篇小文章你一定要看哦。首先我们打开新建一个空白文档,输入数据,我们会发现

    2023年01月20 246
  • 花粉过敏怎么办,花粉过敏打喷嚏作文

    花粉过敏打喷嚏作文,首先,要避免直接接触花粉源。减少户外时间是最有效的防护措施。如需出门在外或户外运动,出门前应关注近期花粉浓度,花粉浓度较高时,要强化个人防护且尽量避免长时间暴露,尽可能选择清晨、夜

    2023年01月11 265
  • 点号在中间怎么打

    ③他接着说:“最近这儿连降暴雨。老妈已到北京去了。小红上了高中。”2、没有比较大的停顿不用冒号。例如:3、下文和提示语的内容不一致时,不能用冒号。例如:他喊了一声:“跟我来!”就向前冲锋。(冒号前后没

    2023年02月06 243
  • 应收账款周转率怎么算,应收账款周转率计算例题

    一、应收账款周转率的定义应收账款周转率是企业在一定时期内(通常为一年)赊销净额与应收账款平均余额的比值;计算公式:应收账款周转率=赊销收入净额/应收账款平均余额赊销收入净额=赊销收入-赊销退回-赊销折

    2023年02月06 255
  • 怎么接单,陪玩接单考核答案大全

    一、做好充分的准备一个人做任何事情,如果没有准备我相信他是不可能一帆风顺的,只有准备还不行,一个超级门市要成为业务高手,必须做好充分准备充分准备分为三个方面:1.心态和信念的准备如果一个人不喜欢婚纱行

    2023年02月08 297
  • 怎么打出,₂₀₂₂怎么打出来

    推荐序一钢铁是这样淬火的2020年8月10日,《财富》杂志发布了2020年世界500强企业名单,中国共有133家公司上榜,超过美国(121家)。尽管有人说,这只是大而不强,没有什么特别了不起的意义,但

    2023年02月08 246
  • 这个怎么,这个可以吗用英语怎么说

    近日,在各大社交媒体平台上有网友反映这是多音字zhè]指示代词。指称比较近的人或事物:~个人。~本书。[zhèi]义同“这(zhè)”。用于口语。在口语里,“这”后面跟量词或数词加量词时,通常读zhè

    2023年02月08 233
  • 怎么查分,个人成绩查询

    我想看看养老金是否到账了,该怎么办?前阵子办理了工伤一次性医疗补助金业务,但记不清是用哪张银行卡作为领取待遇的卡了,我可以在哪里查询?驾驶证查分方法:1、到各市各区县交通支大队的办公大厅通过触摸查询终

    2023年02月08 217
  • 问卷怎么做,做问卷必须要量表吗

    调查问卷是我们经常使用的一种科研方法,它可以帮助我们有效地进行定量分析。那如何才能设计出一份好的调查问卷呢?1、明确调查主题我们在进行问卷调查之前明确调查主题是非常重要的,这关系到我们之后怎么设计问卷

    2023年02月10 219
  • ps怎么抠印章,ps怎么把盖在字上的章抠出来

    如何抠公章。对于这样一个问题,单纯拿PS抠图技术来说,既然我们能抠毛发、抠婚纱、抠各类透明杯子,那抠公章肯定不在话下。也就是说如果面前有一张扫描或者相机翻拍的公章图,我们肯定能抠出来。但是有一个比抠公

    2023年01月22 242
  • 怎样去引导孩子,倾听孩子摘抄和心得体会

    孩子犯错时该打骂吗?聪明的家长都知道如何正确引导孩子!在当妈之前,我们都觉得自己一定会是理想中的温柔妈妈,但是在带孩子的过程中,不可避免的很多妈妈都成了“母老虎”,这并不是说妈妈们真的对孩子有多么的不

    2022年12月29 262
  • 怎样才能写好作文

    有一次,我到一个学校讲作文,学生一听是讲作文,立马没有了兴趣,我说今天我们先不讲作文,先讲一个故事好不好,孩子们立马有精神了。西游记我们都熟悉,小孩子也很喜欢看。里面的师徒四人各有特点,个个都有当作家

    2022年12月27 244
  • 波浪号怎么打出来

    日常办公中,我们总是要与Word打交道,当我们在和一份Word文件相爱相杀时,别人可能几分钟就轻松搞定了!因为任何工作都需要技巧,所以下面我们整理了一些Word小技巧,希望能帮到大家!快速添加分隔线双

    2023年01月18 204
关注微信