雪花算法生成的id太长导致js精度丢失

/ 技术收藏 / 没有评论 / 348浏览

雪花算法,具体的就不介绍了,搜索引擎一大堆。雪花算法生成的一共是19位long型数字,可以保证增长趋势。 如果把数据发送到前端,前端js接收后会转number,而js的number最大长度只有16位,所以就会产生精度丢失的问题。如果我们用了雪花算法做id,那么前端根据id将查询不到数据。

从大的方面说,主要有两种解决方法:

  1. 后端把long转换位string发送到前端,具体有以下几种做法 (1). 把需要转换的字段加上序列化注解,在序列化的时候就转成string

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

(2). 全局配置,直接修改全局的序列化器,把所有的long都转成string

 SimpleModule simpleModule = new SimpleModule();
 //long转string
 simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
 objectMapper.registerModule(simpleModule);

(3). 笔者后端使用的mongo存储此次业务数据,并未建立实体pojo,这种情况可以自己处理,把long转位string

Document find = new Document();
find.put("softwareId",softwareId);
Spliterator<Document> spliterator = mongoTemplate.getCollection(MongoConstant.PARAM_TEMPLATE).find(find).spliterator();
List<Document> logList = StreamSupport.stream(spliterator, false).map(doc->{
     doc.put("_id",String.valueOf(doc.get("_id")));
     return doc;
}).collect(Collectors.toList());
  1. 既然精度丢失发生在前端,也可以从前端入手,替换反序列化支持long的json反序列化工具,但是考虑到目前的主流json反序列化工具都会把数字类型反序列化成number,而使用第三方工具可能引发其他问题,本次暂不做深究,感兴趣的小伙伴可以尝试以下。