SecureRandom
有一些我不太懂的东西。以这里的代码为例:
import java.security.SecureRandom;
import java.math.BigInteger;
public final class SessionIdentifierGenerator{
private static SecureRandom random = new SecureRandom();
public static void main(String[] args) {
nextSessionId();
}
public static String nextSessionId(){
BigInteger ss = new BigInteger(130, random);
System.out.println(ss);
System.out.println(ss.toString(32));
return null;
}
}
输出的一个例子是:
1107894191825737787218556533052298445977
q1fikf1m0jagvlrmbtdah0mh4p
由于BigInteger
是整数,输出是安静可预测的,但我不明白的是,自从我应用toString()
方法以来,随机字符串来自哪里,所以我认为这个字符串是费用的它将是相同的数字序列,但作为一个字符串,那么这个happing的方式和原因是什么?
感谢。 ps:我不知道以前是否曾经问过,但我没有找到任何东西...... 原始代码wiki
答案 0 :(得分:5)
您正在调用toString(32)
,its javadoc表示
返回给定基数中此BigInteger的String表示形式。
所以你问的是基数为32而不是传统基数10的数字的字符串表示。如果你传递16,你会得到十六进制格式的数字,数字从0
到{{ 1}}。如果你通过8,你会得到它作为八进制数,数字从0到7。
答案 1 :(得分:1)
你的.toString(32)
并没有使它成为32个字符。它将它显示为基数32。
答案 2 :(得分:1)
这是因为你正在调用toString with a radix
使用基数将整数转换为String。十六进制(0123456789abcdef)例如是基数16.您使用的是基数32,因此您可以获得更多不同的字符。在输出为String之前,它将整个数字转换为数字32。
如果您只想将数字作为字符串表示,则调用正常的.toString方法就足够了。这实际上是在您调用
时由System.out.println方法完成的System.out.println(ss);
将该输出与
进行比较System.out.println(ss.toString());
你会发现它总是一样的。