パフォーマンス重視の環境でMessageDigestを使用して複数のスレッドから複数のキーをハッシュする必要があります。 MessageDigestはオブジェクトの状態を格納するため、MessageDigestはスレッドセーフではありません。キーのスレッドセーフハッシュを実現する最良の方法は何でしょうか?スレッドセーフなJavaでのMessageDigestが必要です
ユースケース:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
//somewhere later, just need to hash a key, nothing else
messageDigest.update(key);
byte[] bytes = messageDigest.digest();
具体的に:
- ウィルのThreadLocalは、動作が保証?パフォーマンスは ペナルティーですか?
- getInstanceによって返されるオブジェクトが異なり、 は互いに干渉しませんか?ドキュメントには '新しい' オブジェクトが記載されていますが、(共有) 共有コンクリートクラスの単なるラッパーかどうかわかりません。
- getInstance()が '実際の'新しいオブジェクトを返す場合、 ハッシュを計算するたびに新しいインスタンスを作成することをお勧めしますか?パフォーマンスペナルティの面では、どれくらいの費用がかかります ?
私の使用例は非常に単純です。単純なキーをハッシュするだけです。私は同期を使用する余裕がない。
おかげで、
私はcodeofのgetInstance()を参照した場合、それは新しいオブジェクトを作成していないようだ、むしろそれは私が下のテストケースを書いたオブジェクト オブジェクト[] OBJS = Security.getImpl を取得するために、セキュリティを呼び出します。 \t MessageDigest messageDigest1 = MessageDigest.getInstance( "SHA-1"); \t MessageDigest messageDigest2 = MessageDigest.getInstance( "SHA-1"); // を更新してダイジェストし、両方のmessageDigestオブジェクトが異なっており、その内側のオブジェクト/バッファも異なっていることがわかりました。だから、私はThreadLocalがうまくいくはずだと思います。 はい、スレッドプールを持つWebサーバーです。私はThreadLocalを使用します。 ありがとうございます。 –
@AnilPadia - 私は強く**推奨していません**は 'ThreadLocal'を使用していません。早すぎる最適化です。私は新しい「MessageDigest」を作成するために約2 * micro *秒のマイクロベンチマークを書いた。これは、ダイジェストを使用するコードよりもはるかに上回ることになります。 – parsifal
ThreadLocalを使用して見られる問題は何ですか?何百というスレッドがあっても、何百ものオブジェクトが存在します。私はそのようなオブジェクトのメモリフットプリントが本当に少ないことを発見しました。 ThreadLocalは私のためにうまくいきます。私もオブジェクトの作成をテストし、4マイクロ秒かかりました。私は本当になぜThreadLocalに反対しているのか知りたいです –