为什么使用 .toString(32) 而不是 .toString(36)?

Jos*_*lds 4 java security cryptography

好奇的:

很多人会使用该[Number].toString(32)方法来执行诸如生成会话 ID 之类的事情,例如:

public class SessionID{

    private static SecureRandom ran = new SecureRandom();

    public static String next() {
        return new BigInteger(130, ran).toString(32);
    }

}
Run Code Online (Sandbox Code Playgroud)

我还看到它用于将散列密码字节转换为字符串格式。但为什么不使用.toString(36)?Base 32 不包括 z、y、x 或 w,那么使用它的原因是什么?(猜测与 32 = 2^5 有关,但我希望得到更好的答案。)

小智 5

正如您所提到的,32 = 2^5,因此每个字符将恰好代表 5 位。由于 128 位是强安全性的首选,26 个基数 32 数字 (32^26) 正好等于 2^130,因此每个字符将代表 5 位,并且 130 位可以均匀地划分为字符,您可以挤压几个额外的位,没有任何额外的字符。如果您改用 base 36,则每个字符需要 6 位。您可以将 129 位放入 25 个字符,但会浪费一些空间。