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

时间:2015-03-21 14:27:58

标签: 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);
    }

}

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

1 个答案:

答案 0 :(得分:3)

正如您所提到的,32 = 2 ^ 5,因此每个字符将恰好代表5位。由于128位是强安全性的首选,26个base-32位(32 ^ 26)正好等于2 ^ 130,因此每个字符将精确地表示5位,130位可以均匀地分成字符,你可以挤几个没有任何附加字符的额外位。如果使用base 36,则每个字符需要6位。你可以将129位装入25个字符,但是有一些浪费的空间。