使用雪花算法生成id时因为BigInteger长度超过17位导致前台js获取时数据失真

        昨天与前台联调时发现前台获取到的id不对,通过postman测试却没有问题,通过百度知道了是因为js没法显示17位以上的int类型。

        由于前台是接受到的时候数据就失真了,所以前台这边没法修改,只能改java后端。

        想到的方法就是传数据的时候不传BigInteger,而是传字符串。因为数据库中都是用的bigint,实体类(bean对象)也都是,从新改不太好也难免会出问题,于是就通过配置类的方式,在请求响应的时候吧BigInteger转为String了。这样就在不动之前代码的情况下解决数据失真问题了。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.math.BigInteger;
import java.util.List;


@EnableWebMvc
@Configuration
public class WebJsonConverterConfig extends WebMvcConfigurerAdapter {
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(jackson2HttpMessageConverter);
    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pholig-Hellman算法(离散对数问题)是一个非常重要的密码学基础算法,其核心在于求解一个模数下离散对数问题。小步大步算法是求解离散对数问题的一种有效方法。本文将介绍如何在C#中使用小步大步算法实现Pholig-Hellman算法。 首先,我们需要实现一个模幂函数。由于题目要求不使用BigInteger类,我们可以通过模重复平方法实现模幂函数。代码如下: ```csharp public static long ModPow(long x, long y, long p) { long res = 1; x %= p; while (y > 0) { if ((y & 1) == 1) { res = (res * x) % p; } y >>= 1; x = (x * x) % p; } return res; } ``` 接下来,我们可以实现小步大步算法。小步大步算法的核心思想是将指数y分解为x^j*b的形式,其中x^j是x的一些次幂,b是小于x^j的整数。我们可以先计算出x^j的值,然后用哈希表存储所有可能的b和其对应的j值,最后查找y对应的b值在哈希表中的j值即可。代码如下: ```csharp public static long BabyStepGiantStep(long a, long b, long p) { // 计算m long m = (long)Math.Ceiling(Math.Sqrt(p - 1)); // 预处理x^j mod p的值 Dictionary<long, long> dict = new Dictionary<long, long>(); long xj = b % p; for (long j = 0; j < m; j++) { dict[xj] = j; xj = (xj * a) % p; } // 计算x^-m mod p的值 long xm = ModPow(a, p - 1 - m, p); // 穷举b*x^-m mod p的值,查找哈希表中对应的j值 long xb = 1; for (long i = 0; i < m; i++) { if (dict.ContainsKey(xb)) { return i * m + dict[xb]; } xb = (xb * xm) % p; } return -1; // 未找到解 } ``` 最后,我们可以实现Pholig-Hellman算法。Pholig-Hellman算法的核心在于求解一个模数下离散对数问题。我们可以先计算出a^x mod p的值,并使用小步大步算法求解该值在模数p下的离散对数x。代码如下: ```csharp public static long PholigHellman(long a, long b, long p) { // 计算m long m = (long)Math.Ceiling(Math.Sqrt(p - 1)); // 预处理a^j mod p的值 long aj = 1; for (long j = 0; j < m; j++) { aj = (aj * a) % p; } // 枚举i,计算a^(im) mod p的值,使用小步大步算法求解 Dictionary<long, long> dict = new Dictionary<long, long>(); long aim = b % p; for (long i = 0; i < m; i++) { dict[aim] = i; aim = (aim * aj) % p; } long ai = ModPow(a, m, p); long aix = 1; for (long i = 1; i <= m; i++) { aix = (aix * ai) % p; if (dict.ContainsKey(aix)) { return i * m - dict[aix]; } } return -1; // 未找到解 } ``` 完整代码如下: ```csharp using System; using System.Collections.Generic; public class PholigHellman { public static long ModPow(long x, long y, long p) { long res = 1; x %= p; while (y > 0) { if ((y & 1) == 1) { res = (res * x) % p; } y >>= 1; x = (x * x) % p; } return res; } public static long BabyStepGiantStep(long a, long b, long p) { // 计算m long m = (long)Math.Ceiling(Math.Sqrt(p - 1)); // 预处理x^j mod p的值 Dictionary<long, long> dict = new Dictionary<long, long>(); long xj = b % p; for (long j = 0; j < m; j++) { dict[xj] = j; xj = (xj * a) % p; } // 计算x^-m mod p的值 long xm = ModPow(a, p - 1 - m, p); // 穷举b*x^-m mod p的值,查找哈希表中对应的j值 long xb = 1; for (long i = 0; i < m; i++) { if (dict.ContainsKey(xb)) { return i * m + dict[xb]; } xb = (xb * xm) % p; } return -1; // 未找到解 } public static long PholigHellman(long a, long b, long p) { // 计算m long m = (long)Math.Ceiling(Math.Sqrt(p - 1)); // 预处理a^j mod p的值 long aj = 1; for (long j = 0; j < m; j++) { aj = (aj * a) % p; } // 枚举i,计算a^(im) mod p的值,使用小步大步算法求解 Dictionary<long, long> dict = new Dictionary<long, long>(); long aim = b % p; for (long i = 0; i < m; i++) { dict[aim] = i; aim = (aim * aj) % p; } long ai = ModPow(a, m, p); long aix = 1; for (long i = 1; i <= m; i++) { aix = (aix * ai) % p; if (dict.ContainsKey(aix)) { return i * m - dict[aix]; } } return -1; // 未找到解 } static void Main(string[] args) { long a = 3; long b = 7; long p = 11; long x = PholigHellman(a, b, p); Console.WriteLine("x = " + x); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值