广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript如何让雪花算法成为空气
  • 790
分享到

JavaScript如何让雪花算法成为空气

2024-04-02 19:04:59 790人浏览 独家记忆
摘要

这篇文章给大家介绍javascript如何让雪花算法成为空气,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我也只能在这里,发表这样无耻的言论。因为xjjdog的修为主要体现在后端上,所

这篇文章给大家介绍javascript如何让雪花算法成为空气,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

我也只能在这里,发表这样无耻的言论。因为xjjdog的修为主要体现在后端上,所以爱屋及乌。这体现了斗争是人类的基本属性:程序员除了要干产品经理、项目经理,内部也并不是铁板一块。

1. 事出有因

就如标题所说,这个会和雪花算法有关。

我们有个系统,使用的是Mysql数据库,所以在数据库的主键选择上,使用的是自增ID。

ID INT  PRIMARY KEY AUTO_INCREMENT

这样的ID简单流畅,但有一系列的弊端,不过用在一般的系统上,够用了。

在临上线之前,项目组邀请公司里最牛x的架构师,对项目进行了一次集中体检。其中的一项重要举措,就是针对于ID生成器的。

“不知道现在的开发系统,都至少要使用Snowflake作为ID生成器么?” 架构师对自增ID的方案非常的不满意。

它指出,哪怕你使用UUID,在遇到系统扩容、分库分表、数据迁移等场景的时候,也比自增ID强。

大家伙一讨论,觉得非常合理。UUID太无序,美团Leaf这种又太复杂,还不如直接使用老掉牙的Snowflake,直接生成最简单的ID即可。

类似于这种。

527574217068392807 527574217068392808

为了让你有个直观的认识,我们看一下Java中Long的最大值。

9223372036854775807

再看一下Int的最大值。

2147483647

可以看到生成的Snowflake ID,是比Int大,比Long小的数值(和最大的比较),所以在数据库中使用bigint存储,再好不过了。

说干就干,批量脚本一改,主键就变大变长了~~~

2. 问题发生

别说,这样子的ID,看起来还比较顺眼。ID在URL里传递,在fORMdata里传递,一看就比较的专业!

/edit.do?id=527574217068392810

系统按照建议改完之后,单元测试很流畅。黑盒测试草草的点了一下,就算通过了。

灵异事件是被客户发现的。

客户说,很多记录,无法编辑、无法删除。提示找不到记录。

很多公司的尿性你也是知道的,和客户交流的,通常不太懂技术。对着客户的屏幕用牛x的手机拍照,原图发过来就有十几MB。但灵异的是图片大,内容却模模糊糊。

后端程序员,眯着眼睛打开图片,把里面显示的ID给抠出来,放在系统里一查。

没有此记录。

肯定是眯眼的姿势有问题。后端程序员不得不再录一遍。可惜的是,依然没有这条记录。

没办法,只好把客户的数据库拷贝一份过来。页面上一点击,果然有问题!

浏览器response里返回的数据竟然和preview里的不一样

3. 问题验证

也就是说,一个好好的数字:527183991665594368,经过浏览器一翻译,变成了527183991665594400。

我们在浏览器的devtools里面调试一下。

JavaScript如何让雪花算法成为空气

为了进一步验证,我们从typescriptjs,都试验一下。

 # cat test.ts let a = 527183991665594368; console.log(a);  # tsc test.ts  # cat test.js var a = 527183991665594368; console.log(a);  # node test.js 527183991665594400

可以看到,在整个js的生态里,都存在这个问题,真是坑坏了后端。

4. Why?

这是因为。在JavaScript中,存在两种数字。Number和BigInt。最常用的,就是number。

最大的Number,叫做Number.MAX_SAFE_INTEGER,它的值为:

2^53-1 或者

+/- 9,007,199,254,740,991

众所周知,Java中的Long,是64位的。Js中的这个安全Integer,完全达不到Java中定义的长度。

这就是万恶的IEEE_754规范,它在Long长度大于17位时会出现精度丢失的问题。

在最新的TypeScript3.2中,可是直接使用BigInt这个类型进行编码,或者使用long.js这种封装后的苦,但还是太麻烦了,需要编码太多,而且还可能漏掉。

使用数字类型,传输数据,实在是不太靠谱,转来转去,就物是人非了。

最好的方式,就是使用string进行传递。哪怕以后后台ID的长度变成了128位的,也不惧怕这种转换。

在Java中,如果你用的是jackson,直接通过注解,就可以完成字符串更改,不需要再改动数据库。

@JSONSerialize(using=ToStringSerializer.class) private Long id;

这问题,明显不是后端的锅。后端传递了正确的数据到前端,能不能处理、处理的正确不正确,根本和后端一点关系都没有。JS的这种按照规范的不规范处理,已经让很多人踩坑。不管是萌新,还是老鸟,依然前赴后继的掉到坑里,不得不说这个特性是非常反人类的。

关于JavaScript如何让雪花算法成为空气就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: JavaScript如何让雪花算法成为空气

本文链接: https://www.lsjlt.com/news/82291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript如何让雪花算法成为空气
    这篇文章给大家介绍JavaScript如何让雪花算法成为空气,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我也只能在这里,发表这样无耻的言论。因为xjjdog的修为主要体现在后端上,所...
    99+
    2022-10-19
  • springboot中如何使用雪花算法生成雪花ID
    这篇文章主要介绍“springboot中如何使用雪花算法生成雪花ID”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot中如何使用雪花算法生成雪花ID”文章能帮助大家解决问题。1、什么...
    99+
    2023-07-05
  • mybatis-plus 如何使用雪花算法ID生成策略
    目录mybatis-plus 可以通过@TableId注解指定主键生成策略看一下源码大概找一下雪花算法的实现方式自定义ID生成器实现Mybatis-plus 中生成雪花算法id的工具...
    99+
    2022-11-12
  • Mybatis-plus如何提前获取实体类用雪花算法生成的ID
    Mybatis-plus中,通过设置@TableId可以让Mybatis-plus自动为我们生成雪花算法的ID号,该ID号是一个长整型数据,非常方便。但是雪花算法的ID号是在Inse...
    99+
    2022-11-13
  • PHP中的对象编程算法:如何让函数成为你的好帮手?
    随着Web技术的不断发展,PHP已经成为了一种广泛应用的服务器端脚本语言。PHP的面向对象编程(OOP)特性,使得开发者可以更加高效地完成复杂的任务。其中,函数作为OOP中的重要组成部分,不仅可以帮助我们简化代码,而且还可以提高代码的可读...
    99+
    2023-10-10
    对象 编程算法 函数
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作