雪花算法的精度问题¶
在使用雪花算法作为数据的 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);
}
}
}