パフォーマンスが重要な環境でMessageDigestを使用して、複数のスレッドから複数のキーをハッシュする必要があります。 MessageDigestはその状態をオブジェクトに格納するため、スレッドセーフではないことを知りました。キーのスレッドセーフハッシュを実現する最良の方法は何でしょうか。
使用事例:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
//somewhere later, just need to hash a key, nothing else
messageDigest.update(key);
byte[] bytes = messageDigest.digest();
具体的には:
私の使用例は非常に単純です-単純なキーをハッシュするだけです。同期を使用する余裕はありません。
おかげで、
必要になるたびにnew MessageDigest
インスタンスを作成します。
getInstance()
から返されるインスタンスはすべて異なります。別々のダイジェストを維持するため、これらは必要です(それでも不十分な場合は here's ソースへのリンク)。
ThreadLocal
canは、スレッドプールと共に使用すると、構築にコストがかかるオブジェクトを維持するためにパフォーマンス上の利点を提供します。 MessageDigest
の構築はそれほど高価ではありません(ここでも、ソースを確認してください)。
別の方法として、MessageDigest用のApache Commonsのスレッドセーフラッパーである DigestUtils を使用します。
sha1() は必要なことを行います:
byte[] bytes = sha1(key)
DigestUtilsは、生のMessageDigestよりスレッドセーフではないようです。依然として内部ではMessageDigest.getInstanceを使用しています。