2

私は Java 1.7 を使用しており、以下のコードが示すように (Ubuntu で Oracle の Java 7 コンパイラでコンパイルされています) 、コードが 2 つの疑似乱数シーケンスの開始値に対して 2 つの異なる BigInteger を生成するため、java.security.SecureRandomのシードは不要のようです。

import java.security.SecureRandom;
import java.math.BigInteger;

public class SessionIdTest {

    public static void main (String args[]) {
    long seed = System.currentTimeMillis();
        {
            SecureRandom random = new SecureRandom();
            random.setSeed(seed);
            BigInteger a = new BigInteger(130, random);
            System.out.println(a);
        }
        {
            SecureRandom random = new SecureRandom();
            random.setSeed(seed);
            BigInteger a = new BigInteger(130, random);
            System.out.println(a);
        }
    }
}

それではsetSeedの目的は何ですか?それとも、シードに加えて、 SecureRandomもランダム性の他のソースを使用していますか?

4

3 に答える 3

2

javadoc は次のように述べています。

多くの SecureRandom 実装は、疑似乱数ジェネレーター (PRNG) の形式になっています。つまり、決定論的アルゴリズムを使用して、真のランダム シードから疑似乱数シーケンスを生成します。他の実装では真の乱数が生成される場合がありますが、他の実装では両方の手法を組み合わせて使用​​する場合があります。

したがって、文書化されているように、安全なランダムにシードして決定論的な値のシーケンスを生成することを期待しても、必ずしも機能するとは限りません。

于 2012-12-24T10:40:04.120 に答える
2

JavaDoc は次のように述べています。

指定された に含まれる 8 バイトを使用して、このランダム オブジェクトを再シードしますlong seed指定されたシードは、既存のシードを置き換えるのではなく、補足します。したがって、呼び出しを繰り返してもランダム性が低下しないことが保証されます。

于 2012-12-24T10:40:07.537 に答える