摘要:雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,或者时间向左位移多少,这些在算法具体逻辑确定后就不会变了。
雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,或者时间向左位移多少,这些在算法具体逻辑确定后就不会变了。那么写成最后的数字和用位运算计算出来有什么区别呢?
其实没有区别,我们的程序分为编译期和运行期,我们直接把程序编译好,然后查看class文件,就会发现,两种写法编译结果是一样的。用位运算计算出来只是更加灵活而已,定义很多死的数字也容易写错,后期维护混乱。所以,下面我们来一个最终版,首先看基本的几个常量定义:
然后看时间部分的常量:
再看机器信息的常量:
最后看毫秒内序列的常量定义:
上面的常量中,只要修改最开始的四个部分的长度,下面的所有常量都会自动修改。
再来看一下主程序:
注意上面判断统一毫秒内序列的变化。其它辅助方法都没有什么变化,不再讨论。现在我们再看看编译完后生成的class文件:
可以看到编译后的文件其实就是最终定义了死的常数。包括主程序也是一样:
上面就是雪花算法的最终版!!!
最后来测试一下效率,我们来生成300万个id看看花费的时间:
代码地址:https://gitee.com/blueses/sno... 07
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76166.html
摘要:原理的雪花算法,使用语言实现。生成的整体上按照时间自增排序,并且整个分布式系统内不会产生碰撞由和作区分,并且效率较高。据说每秒能够产生万个。 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 ...
摘要:前面的理论基础和位运算都了解了,下面我们来生成雪花算法的第一部分,也就是时间部分。这个时候就有一个问题了,如果我们系统的时钟错了会不会有问题会所以要做判断而且系统的时钟错误也是雪花算法的一个致命问题,所以要一定要保证服务器的系统时间正确。 前面的理论基础和位运算都了解了,下面我们来生成雪花算法的第一部分,也就是时间部分。时间部分的逻辑起始很简单,就是规定一个起始时间戳,然后用当前时间戳...
摘要:雪花算法生成的最终结果其实就是一个类型的长整型数字,这是一个大前提算法所有的内容都是针对这个数字进行运算的。根据上面的理论可以开始学习雪花算法。 针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。既然号称在全局分布式系统中唯一...
摘要:前面的内容把雪花算法的时间部分和机器信息部分都生成了,下面来生成最后一部分,就是毫秒内的序列。这样毫秒内的序列数就算获取成功了。 前面的内容把雪花算法的时间部分和机器信息部分都生成了,下面来生成最后一部分,就是毫秒内的序列。什么意思呢?我们在生成时间部分获取时间戳的时候,使用 long now = System.currentTimeMillis(); 获取,是个毫秒级的时间戳,但是即...
摘要:前面介绍了雪花算法的理论基础,可以对大概的算法有个了解,但是细节上可能还是模糊,下面来说一下雪花算法中用到的位运算。这就是雪花算法中两个位移操作的作用。 前面介绍了雪花算法的理论基础,可以对大概的算法有个了解,但是细节上可能还是模糊,下面来说一下雪花算法中用到的位运算。这里先介绍两个,一个是:
阅读 2947·2023-04-26 02:04
阅读 1262·2021-11-04 16:07
阅读 3605·2021-09-22 15:09
阅读 609·2019-08-30 15:54
阅读 1871·2019-08-29 14:11
阅读 2507·2019-08-26 12:19
阅读 2216·2019-08-26 12:00
阅读 713·2019-08-26 10:27