ポートレットフィルタ

JSR 168 の仕様には、定義されていないので、Portals Bridges 内に作ったのだが、宣伝していないだけあった、ほとんど使われていないような・・・。ということもあり、jetspeed-userに出ていたメールに返信する。そろそろまじめに宣伝しないとな・・・。というわけで、ポートレットでフィルタを利用したい場合は、ご利用くださいませ。どっかに簡単な記事とか書くようにした方がいいのかな・・・。

commons-mathによる乱数生成

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の方でもいいような気が。

乱数の生成

java.util.Random、java.security.SecureRandom、org.apache.commons.lang.RandomStringUtils、commons-math?などがあるみたいだな・・・。どれを使うのがよいだろうか。それぞれを見てみるか。

で、ちらっとみたら、RandomStringUtilsはRandomを呼んでいるだけっぽいな。Tomcatのセッションとかは、SecureRandomを使うそうな。commons-mathのもSecureRandomを使えるものがあるみたいだから、SecureRandomかcommons-mathを使うのがよいかな。でも、SecureRandomは、生成コストが高いみたいだ。うーん、なるほど、勉強になった。