一.雪花算法组成部分
雪花算法使用64位long类型的数据存储id
1.第一位占用1bit,其值始终是0,没有实际作用。
2.时间戳占用41bit,精确到毫秒,总共可以容纳约69年的时间。
3.工作机器id占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,做多可以容纳1024个节点。
4.序列号占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID。
二.雪花算法的实现
主要依赖于数据中心ID和数据节点ID两个参数
1.确定位数分配
2.时间戳左移
3.机器ID左移
4.序列号
5.位或运算
注意:
1.时间戳的递增性:每次生成ID时,需要确保时间戳是递增的,以保证ID的全局唯一性。
2.时钟同步:由于雪花算法严重依赖服务器时钟,因此需要确保所有服务器的时钟是同步的,以避免产生重复的ID。
3.机器ID的唯一性:每台机器都应该有唯一的机器ID,以确保在同一时刻,不同的机器可以生成不同的ID。
三.雪花算法的优点:
1.能满足高并发分布式系统环境下ID不重复
2.基于时间戳,可以保证基本有序递增
3.不依赖第三方的库或者中间件
4.生成效率极高
四.雪花算法的缺点
1.依赖系统时间:雪花算法生成ID的过程中依赖于系统时间,如果系统时钟被回调或者改变,可能会导致ID冲突或者重复。
2.时钟回拨问题:如果系统时钟出现回拨现象,即当前时间戳小于上一次生成ID的时间戳,雪花算法会抛出异常或生成重复的ID.
3.机器ID和数据中心ID的限制:雪花算法中,机器ID和数据中心ID的位数是固定的,分别占用5位。这意味着最多只能支持1024个节点(包括数据中心和工作节点的组合)。
4.ID长度和精度问题:雪花算法生成的ID是一个64位的long型数字。
注意:
在Web开发中需要跟js打交道,而js支持最大的整型范围为53位,超过这个范围就会丢失精度,53之内可以直接由js读取,超过53位就需要转换成字符串才能保证js处理正确。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。