雪花算法
文章平均质量分 67
郭艺宾
富有激情的学习Java
展开
-
雪花算法(07)雪花算法最终版
雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,或者时间向左位移多少,这些在算法具体逻辑确定后就不会变了。那么写成最后的数字和用位运算计算出来有什么区别呢?其实没有区别,我们的程序分为编译期和运行期,我们直接把程序编译好,然后查看class文件,就会发现,两种写法编译结果是一样的。用位运算计算出来只是更加灵活而已,定义很多死的数字...原创 2019-08-12 20:32:32 · 1704 阅读 · 0 评论 -
雪花算法(06)再说几个位运算
n位二进制表示的最大值 雪花算法已经初步完成了。现在我们再来看几个位操作。先看第一个,还是左移操作,不过这里演示负数左移: << 看这个之前,我们先看一个关键的数字,最大的负整数,-1L转换为二进制后的形式: 这里注意二进制数字的思路是相反的,在负整数中,除去负号外,那个数字越大,这个负数就越小,在Java的二进制形式中,首位代表正负号,除去首位...原创 2019-08-12 20:26:45 · 1083 阅读 · 0 评论 -
雪花算法(05)毫秒内序列
前面的内容把雪花算法的时间部分和机器信息部分都生成了,下面来生成最后一部分,就是毫秒内的序列。什么意思呢?我们在生成时间部分获取时间戳的时候,使用 long now = System.currentTimeMillis(); 获取,是个毫秒级的时间戳,但是即使是这么短的时间,对于电脑来说也足够生成很多个id,所以很多id可能会在同一个毫秒内生成,也就是时间部分的数值一样。这个时候就要让同一个毫秒...原创 2019-08-12 20:13:28 · 1363 阅读 · 0 评论 -
雪花算法(04)机器信息
时间部分生成后,下一步是机器信息,占10位。我们这里把机器信息分成两部分,一部分是数据中心id,占5位,一部分是机器id,占5位。这两个id可以在部署项目的时候根据不同的机器自定义不同的id,这样能人为的保障每个id都不同。比如: /** 设置数据中心id为1 */private static final long DATA_ID = 1L;/** 设置机器id为2 */pri...原创 2019-08-12 20:08:14 · 2881 阅读 · 3 评论 -
雪花算法(03)生成时间
前面的理论基础和位运算都了解了,下面我们来生成雪花算法的第一部分,也就是时间部分。时间部分的逻辑起始很简单,就是规定一个起始时间戳,然后用当前时间戳减去起始时间戳,这两个数的差就是我们要的结果。简单看一下代码逻辑: 我们规定的起始时间是 2015-01-01 00:00:00 ,然后获取当前时间,用当前时间减去起始时间,就是我们要的时间部分的数值。这个时候就有一个问题了,如果...原创 2019-08-12 19:59:46 · 1986 阅读 · 0 评论 -
雪花算法(02)算法中的位运算
前面介绍了雪花算法的理论基础,可以对大概的算法有个了解,但是细节上可能还是模糊,下面来说一下雪花算法中用到的位运算。这里先介绍两个,一个是: << 一个是 | < <的作用是将数字向左移动,这里的数字指的是二进制中的数,并不是字面上的长整型数字,当然移动后数字字面值肯定发生变化,但是这里对这个操作的主要理解要放在二进制数字向左移动上,而不是字面值扩大2...原创 2019-08-12 19:48:24 · 1125 阅读 · 0 评论 -
雪花算法(01)介绍
针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。既然号称在全局分布式系统中唯一,那么主键的生成规则必然要复杂一些,以前看过很多资料,都对雪花的生成一知半解,最后才发现是对Java的位运算没有彻底了解,这里想针对雪花算法,以一种浅显的的方...原创 2019-08-12 19:39:46 · 1099 阅读 · 0 评论