了解SecureRandom字符串生成器?

时间:2013-12-12 22:11:40

标签: java security

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

3 个答案:

答案 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());

你会发现它总是一样的。