跳转至

雪花算法的精度问题

在使用雪花算法作为数据的 id 时,由于雪花算法的较长位数,id在被序列化时会出现如下每个 id 在最后两位的数字均丢失的精度问题:

"items": [
      {
        "id": 1389172225111048200,
        "title": "Collection",
        "children": [
          {
            "id": 1389172441935593500,
            "title": "1",
            "children": []
          },

其原因在于 javascript 不支持后台返回的 Long 类型,且 javascript 的number 类型数值范围是 -2^53 ~ 2^53 , 小于雪花算法生成的 id 的数值,因此在进制转换时会出现精度问题使得 javascript 无法正常存储

解决方案

此情况一般上讲可以有两种解决方案,但归根到底都是将使用雪花算法的字段从 Long 类型转换为 String 类型。

这里使用 jackson 来解决问题,你也可以使用其他库。

1. 针对使用雪花算法的 id 字段设置类型转换

public class ChapterVO {
    @JsonSerialize(using = ToStringSerializer.class)
    Long id;
}

2. 全局类型转换

编写一个 json 配置类,将 Long 类型序列化成 json 时自动转换为 String 类型

@Configuration
public class JacksonConfiguration {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            // 指定 Long 类型转换为 String 类型
            builder.serializerByType(Long.class, ToStringSerializer.instance);
        }
    }
}