将数字转换为字符串而不丢失内存

Converting number to string without losing memory

所以一个 Long(在 java 中说)是 8 个字节的大小,可以存储很大的数字。我想将它转换为字符串,但不会丢失内存。基本上取 100 个数字(800 字节),将它们转换为字符串(接近 800 字节),然后在我需要它时将其转换回数字数组。

这个问题的原因是我想在我的 JWT 令牌中存储相当多的数字,所以如果我把它们当作字符串,那么这些数字的大小将比它在理想世界。有什么想法可以实现吗?

这基本上就是序列化。将 long 值转储到字节数组中,然后将其编码为兼容的表示形式,例如 Base64:

import java.util.Base64;

public String encodeLongs(long[] numbers) {
    byte[] bytes = new byte[8 * numbers.length];
    for (int i = 0; i < numbers.length; i++) {
        // Taken from 
        long v = numbers[i];
        int idx = i * 8;
        bytes[idx + 0] = (byte)(v >>> 56);
        bytes[idx + 1] = (byte)(v >>> 48);
        bytes[idx + 2] = (byte)(v >>> 40);
        bytes[idx + 3] = (byte)(v >>> 32);
        bytes[idx + 4] = (byte)(v >>> 24);
        bytes[idx + 5] = (byte)(v >>> 16);
        bytes[idx + 6] = (byte)(v >>>  8);
        bytes[idx + 7] = (byte)(v >>>  0);
    }
    return Base64.getEncoder().encodeToString(bytes);
}

您也可以 return 一个字节数组而不是一个字符串,如果这对您来说更方便的话。 Base64 编码产生的开销约为原始大小的 1/3(假设您使用 UTF-8 或类似编码)。请注意,如果您使用的是基于文本的格式,则通常不可能实现零开销,尽管您可以研究其他编码,例如 Base-122,尽管 Base64 具有无处不在且已在大多数语言中实现的优势.

另一种选择是先压缩字节数组(例如使用 GZIP),然后在 Base64 中对其进行编码。根据输入的大小、数字的性质(例如,它们是否倾向于在某个范围内)和压缩算法,您可能或多或少会成功,但如果数字随机分布在整个范围内很长的数字,你可能无法压缩很多。