PHP解决雪花算法ID在前端精度丢失的问题
1738 2023年08月28日 后端雪花算法(Snowflake)是一种用于生成全局唯一ID的算法,其基本思路是结合时间戳、机器ID、租约ID和序列号生成一个64位的数据,从而保证ID的唯一性。
雪花算法的生成过程如下:
- 时间戳:使用当前时间戳作为ID的一部分,时间戳的精度为纳秒级。
- 机器ID:使用本地的机器ID作为ID的一部分,机器ID可以通过环境变量、网络配置等方式获取。
- 租约ID:租约ID是一个可选的参数,可以用于区分不同的租户。租约ID的生成方式可以是用户自定义的。
- 序列号:序列号是一个递增的整数,用于保证生成的ID唯一。
根据以上四个参数,可以生成一个64位的雪花算法ID,其中前40位表示时间戳,后24位表示机器ID,再后8位表示租约ID,最后8位表示序列号。
雪花算法的优点在于可以保证生成的ID是全局唯一的,并且可以自动处理分片等异常情况。但是,雪花算法也有一些缺点,比如生成的ID长度较长,占用空间较多,并且生成ID的时间延迟较大。
64位的雪花算法ID转成十进制长度是19位,然而js的number类型最大值是9007199254740991,所以雪花ID传到js上,会有精度问题。
解决方案:
把number类型转成string类型
/**
* 将json的int类型转换为string类型 ,js number 最大值 9007199254740991
* @param $str
* @param int $minLength 最小的转换位数,即只有大于等于这个长度的数字才会被转换为字符串
* @return string|string[]|null
*/
function jsonInt2String($str, $minLength = 16)
{
if (!($str && is_string($str) && $minLength > 0)) {
return $str;
}
return preg_replace('/:\s*(-?\d{' . $minLength . ',})/', ': "$1"', $str);
}
-
使用Echarts画甘特图
Echarts是一个非常强大的图表库, 下面我们来使用它来画甘特图,
-
go语言怎么连接mysql,并实现增删改查
要使用Go语言连接MySQL,需要使用第三方库。常用的库包括: 这里以go-sql-driver/mysql为 […]
-
beego实现模块化开发
Beego 框架可以通过模块化开发来提高项目的可维护性和可扩展性,可以将一个大型的应用划分为多个模块,每个模块独立维护,有自己的控制器、视图和模型等。
-
Beego实现JWT
Beego是一个基于Go语言的Web框架,实现JWT认证可以通过beego的中间件机制来实现,下面是一个简单的 […]
-
使用Axios+PHP+JWT实现登录认证
JWT(JSON Web Token),顾名思义就是可以在Web上传输的token,这种token是用JSON格式进行format的。它是一个开源标准(RFC7519),定义了一个紧凑的自包含的方式在不同实体之间安全的用JSON格式传输信息。
-
PHP解决雪花算法ID在前端精度丢失的问题
雪花算法(Snowflake)是一种用于生成全局唯一ID的算法,其基本思路是结合时间戳、机器ID、租约ID和序列号生成一个64位的数据,从而保证ID的唯一性。 雪花算法的生成过程如下:
-
虚拟滚动实现页面百万数据滚动
1.概念 虚拟滚动是一种优化长列表性能的技术,它通过按需渲染的方式,只渲染可见部分的列表项,而不是渲染整个列表 […]
-
go实现MD5
在这个示例中,我们使用了Go标准库中的crypto/md5包来计算一个字符串的MD5值。首先,我们将字符串转换 […]
-
Linux服务器Rsync结合inotify同步文件
一、实现效果 服务器A:192.168.161.150 (分布服务器)(rsync客户端+inotify) 服务器B:192.168.161.151 (WEB服务器1)(rsync服务端) 服务器C:192.168.161.152 (WEB服务器2)(rsync服务端) 说明:服务器A有文件更新,自动同步到服务器B和C
-
JavaScript实现滑动验证码
滑动验证码(也叫做滑动拼图验证码)是一种用户交互形式的验证码,通常用于网页或移动应用的登录、注册或敏感操作。其 […]