dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
28.74k stars 7.45k forks source link

请教一下 Base62.encode() 大数字类型输入结果反而会变长 #3615

Closed a-leyi closed 1 month ago

a-leyi commented 1 month ago

版本情况

JDK版本: corretto-21.0.2 hutool版本: 5.8.28

问题描述(包括截图)

  1. 复现代码
// 生成雪花ID
String snowflakeNextIdStr = IdUtil.getSnowflakeNextIdStr();

System.out.println(Base62.encode(snowflakeNextIdStr));

// 假设:snowflakeNextIdStr  = "1800774833102905344"
// 输出:1hS2UR6CMkY3zQYf386ltqhtEi

https://www.hutool.cn/docs/#/core/Codec编码/Base62编码解码-Base62?id=base62编码解码-base62

根据文档所说,可以用于短URL生成,我想将雪花ID进行长度缩短,但是并未达到效果,反而是更长了,但是我用gpt的代码,确实是缩短了,为什么hutool提供的Base62.encode是这种结果呢,我看源码但是看不太懂,我不清楚这是不是个问题,所以来请教一下

以下代码gpt生成
private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

public static String base62Encode(BigInteger value) {
    StringBuilder result = new StringBuilder();
    BigInteger base = BigInteger.valueOf(62);
    while (value.compareTo(BigInteger.ZERO) > 0) {
        BigInteger[] divmod = value.divideAndRemainder(base);
        result.insert(0, BASE62.charAt(divmod[1].intValue()));
        value = divmod[0];
    }
    return result.toString();
}

// 假设:snowflakeNextIdStr  = "1800774833102905344"
// 输出:291ZCmHJVhY
looly commented 1 month ago

你可以找下几个在线工具,生成都没这么短的。

区别是GPT生成的以数字为基准,即把你的ID作为数字计算,结果肯定小。

Hutool把你的ID按照字符串对待了。

changhr2013 commented 1 month ago

关联 gitee 的 issue https://gitee.com/dromara/hutool/issues/I8SPAG#note_24130945

a-leyi commented 1 month ago

谢谢大佬们,gitee中的这篇文章中解释也很清晰,学习到了