id生成器雪花算法和雪花算法的sony实现(代码片段)

beckbi beckbi     2023-03-19     151

关键词:

1 雪花算法

首先确定我们的数值是64位,int64类型,被划分为四部分,不含开头的第一个bit,因为这个bit是符号位。用41位来表示收到请求时的时间戳,单位为毫秒,然后五位来表示数据中心的id,然后再五位来表示机器的实例id,最后是12位的循环自增id(到达1111,1111,1111后会归0)。

这样的机制可以支持我们在同一台机器上,同一毫秒内产生2 ^ 12 = 4096条消息。一秒共409.6万条消息。从值域上来讲完全够用了。但是对微博这样的场景来说,时间戳可能会标识更小的粒度。

 2**41 秒的话为69730年,我们标识成毫秒69年, 其实10毫秒就够了。690年。也就是说一豪秒可以产生409万条消息

当然,我们可以使用更长的bit来表示,这个需要考虑业务量了。理论上我们可以实现无线长度的数据,因为只要使用字符串就行。

 

2 雪花算法的sony实现

2.1 功能描述

39位时间戳,8位序列id,16位机器id

 

 

 

2.2 详细描述

作者自己的描述

// 39 bits for time in units of 10 msec
// 8 bits for a sequence number
// 16 bits for a machine id

每10ms生成一个id,

 

核心代码 

uint64(sf.elapsedTime)<<(BitLenSequence+BitLenMachineID) |
uint64(sf.sequence)<<BitLenMachineID |
uint64(sf.machineID)

 

每次生成后需要休眠10ms

type Settings struct
StartTime time.Time//开始时间
//机器id
MachineID func() (uint16, error)
//检测机器id
CheckMachineID func(uint16) bool

// Sonyflake is a distributed unique ID generator.
type Sonyflake struct
//锁
mutex *sync.Mutex
//开始时间
startTime int64
//
elapsedTime int64
//序列号
sequence uint16
//机器id
machineID uint16

const sonyflakeTimeUnit = 1e7 // nsec, i.e. 10 msec

 

2.3 待改进

其实sony的雪花算法要在实际的场合使用,待改进的地方太多了。

1 机器编码问题,使用ipv4

2 生成id太少,每10ms生成256个,1秒大概2.56万个id,在有些场景下感觉不太够用

我后续可以完善写一个更好的可用的库。

 

 

 

 

 

 

 

 

 

 

 

 

id生成算法-雪花算法(snowflake)及代码实现(代码片段)

文章目录前言一、ID生成算法对比二、雪花算法原理三、java实现结尾前言唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种:依赖数据库,使用如MySQL自增列或Orac... 查看详情

厉害了,美女同事用单例模式实现了雪花算法!(代码片段)

点击关注公众号,Java干货及时送达雪花算法雪花算法适用于生成全局唯一的编号,比如数据库主键id,订单编号等至于为什么叫雪花算法,是因为科学家通过研究认为自然界中不存在两片完全相同的雪花,所... 查看详情

php实现生成唯一id的雪花算法

参考技术A公司需求.生成唯一id用作兑换卡的id,所以就想用雪花算法,写了一个乞丐版的雪花算法,做个记载 查看详情

java实现雪花算法(snowflake)-生成永不重复的id(源代码+工具类)使用案例(代码片段)

雪花算法是由Twitter公司开源的snowflake(雪花)算法。1、雪花算法的原理雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19),其基本结构:第一位:为未使用第二部分:41位为毫秒级时间(41位... 查看详情

java实现雪花算法(snowflake)-生成永不重复的id(源代码+工具类)使用案例(代码片段)

雪花算法是由Twitter公司开源的snowflake(雪花)算法。1、雪花算法的原理雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19),其基本结构:第一位:为未使用第二部分:41位为毫秒级时间(41位... 查看详情

springboot中使用雪花算法生成雪花id(代码片段)

目录1、什么是雪花算法2、雪花算法的优缺点3、springboot项目中使用雪花算法使用1、什么是雪花算法雪花算法(Snowflake)是一种生成全局唯一ID的算法,由Twitter公司开发。它可以在分布式系统中生成全局唯一的ID,... 查看详情

雪花算法如何生成用户id?有什么高明之处?(代码片段)

...1;前言文章目录博主简介前言雪花算法生成用户ID分布式ID生成器分布式ID的特点snowflake算法介绍设计思想snowflake的Go实现Twitter索尼雪花 查看详情

雪花算法原理和实现

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识出处:https://blog.csdn.net/lq18050010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long... 查看详情

雪花算法原理和实现

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识出处:https://blog.csdn.net/lq18050010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long... 查看详情

雪花算法(代码片段)

...间戳、UUID都不是很可靠。为此,Twitter提出了一种名为“雪花算法”的算法来生成分布式全局唯一ID的算法算法介绍“雪花算法”生成的ID为\\(64\\)位整数,其中,前\\(41\\)位(\\(64\\)位整数第一位表示符号位,不作为开始位)表示... 查看详情

mybatis-plus--使用雪花算法生成主键id--使用/分析(代码片段)

原文网址:MyBatis-Plus--使用雪花算法生成主键ID--使用/分析_IT利刃出鞘的博客-CSDN博客简介说明    本文介绍MyBatis-Plus如何使用其自带的雪花算法生成主键ID。MyBatis-Plus自带的雪花算法MyBatis-Plus自带雪花算法MyBatis-Plus默认使用... 查看详情

雪花算法生成的id,前端无法使用(代码片段)

由于前端Number类型长度不够,所以雪花算法生成的ID,传递给前端就会精度丢失。解决方案:@ConfigurationpublicclassJacksonConfig@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)publicObjectMapperja 查看详情

雪花算法生成id(代码片段)

packagecom.shopping.test;/***SnowFlake的结构如下(每部分用-分开):<br>*0-00000000000000000000000000000000000000000-00000-00000-000000000000<br>*1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正... 查看详情

id号生成雪花算法

参考技术A1、twitter的SnowFlake生成ID能够按照时间有序生成2、SnowFlake算法生成id的结果是一个64bit大小的整数3、分布式系统内不会产生重复id(用有datacenterId和machineId来做区分)datacenterId(分布式)(服务ID1,2,3.....)每个服务中... 查看详情

雪花算法的原理和java实现

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识转自:雨夜青草,链接:topurl.cn/4AVSnowFlake算法,是Twitter开源的分布式ID生成算法。其核心思想就是:使用一个64bit的long型的数字... 查看详情

雪花算法的原理和java实现

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识转自:雨夜青草,链接:topurl.cn/4AVSnowFlake算法,是Twitter开源的分布式ID生成算法。其核心思想就是:使用一个64bit的long型的数字... 查看详情

雪花算法生成的id在返回给前端之后和生成的不一样,到底是什么原因?(代码片段)

一、前言最近在做项目的时候发现用雪花算法生成的id传给前端以后跟生成的不一样,就纳闷,在想为什么会出现这样的问题?二、问题描述:雪花算法生成id为16位,返回到前端之后后两位变为0从两个点出发&... 查看详情

注意:雪花算法并不是id的唯一选择!(代码片段)

Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记!在《悟空传》篇外篇里,有一个忧伤的故事。秋天,树上掉下两片叶子,你要和它们说再见。但你如何知道这片叶子,不是另外一片叶子?是... 查看详情