为什么使用 .toString(32) 而不是 .toString(36)?
Why use .toString(32) and not .toString(36)?
好奇:
很多人会使用 [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 有关,但我希望得到更好的答案。)
如你所说,32 = 2^5,所以每个字符正好代表 5 位。由于128位是首选,安全性强,26位32进制数(32^26)正好等于2^130,所以每个字符正好代表5位,130位可以平分为一个字符,可以挤几个没有任何附加字符的额外位。如果改为使用 base 36,则每个字符需要 6 位。您可以将 129 位放入 25 个字符,但是有些浪费 space.
好奇:
很多人会使用 [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 有关,但我希望得到更好的答案。)
如你所说,32 = 2^5,所以每个字符正好代表 5 位。由于128位是首选,安全性强,26位32进制数(32^26)正好等于2^130,所以每个字符正好代表5位,130位可以平分为一个字符,可以挤几个没有任何附加字符的额外位。如果改为使用 base 36,则每个字符需要 6 位。您可以将 129 位放入 25 个字符,但是有些浪费 space.