commons-mathのドキュメントを読むと、secureの方を使うと *much slower* と言っている。muchって・・・。というわけで、簡単なプログラムを作って、比較することにした。というわけで、以下のものを作る。
package com.marevol.test.random; import java.util.Calendar; import java.util.Date; import org.apache.commons.math.random.RandomData; import org.apache.commons.math.random.RandomDataImpl; public class App { public static int MAX_ROOP_COUNT = 1000; public static void main(String[] args) { Date startTime; Date endTime; System.out.println("Start randomData()"); startTime = Calendar.getInstance().getTime(); App.randomData(); endTime = Calendar.getInstance().getTime(); System.out.println("End randomData() ---> Time: " + (endTime.getTime() - startTime.getTime())); System.out.println("Start secureRandomData()"); startTime = Calendar.getInstance().getTime(); App.secureRandomData(); endTime = Calendar.getInstance().getTime(); System.out.println("End secureRandomData() ---> Time: " + (endTime.getTime() - startTime.getTime())); } public static void randomData() { long value = 0; RandomData randomData = new RandomDataImpl(); for (int i = 0; i < MAX_ROOP_COUNT; i++) { value = randomData.nextLong(1, 1000000); } System.out.println("value=" + value); } public static void secureRandomData() { long value = 0; RandomData randomData = new RandomDataImpl(); for (int i = 0; i < MAX_ROOP_COUNT; i++) { value = randomData.nextSecureLong(1, 1000000); } System.out.println("value=" + value); } }
結果は、だいたい以下のような感じ。
Start randomData() value=212505 End randomData() ---> Time: 12 Start secureRandomData() value=61893 End secureRandomData() ---> Time: 882
つまり、だいたい80倍くらい違うのかね。なるほどね、Secure の方は、1000回ほど呼ばれると、1秒くらいかかってしまうのか。
っで、やりたいことは、文字列の乱数取得なので、nextHexStringでも実験。すると、100文字の乱数文字を得たとしても、3倍程度の差しかないな。たとえば、randomHexString() が 103 ms くらいで、secureRandomHexString() が 291 ms くらいだな。longのときと違って、Secure出はない方に時間がかかっている。この程度の差なら、Secureの方でもいいような気が。