好奇:
很多人会使用[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有关,但我感谢更好的答案。)
答案 0 :(得分:3)
正如您所提到的,32 = 2 ^ 5,因此每个字符将恰好代表5位。由于128位是强安全性的首选,26个base-32位(32 ^ 26)正好等于2 ^ 130,因此每个字符将精确地表示5位,130位可以均匀地分成字符,你可以挤几个没有任何附加字符的额外位。如果使用base 36,则每个字符需要6位。你可以将129位装入25个字符,但是有一些浪费的空间。