2011-06-30 14 views
3

MD5ファイルをJava(またはGroovy)オブジェクトに格納する最も効率的な方法(パフォーマンスと格納領域に最適)は次のユースケース:Javaオブジェクトに大きな16進数(md5)を格納する最も効率的な方法

  1. 他の何千ものmd5合計と比較する必要があります。レコードがMD5
  2. に基づいて/ group by引っ張ることができるように、私は、HSQLDBでこれを格納する必要があるかもしれません
  3. は、私がStringとしてそれを保存しないようにしようとしていますキー

としてMap年代に保存することができます文字列の比較はよりコストがかかり、より多くのスペースを取るためです。 BigInteger(string,radix)はより効率的ですか?また、データベースに永続化する場合は、どのデータ型を選択する必要がありますか?

答えて

4

byte[]をラップし、突然変異を与えないクラスを作成します。マップ内のキーとして使用する場合は、比較可能であるか、ハッシュコードを持つ必要があります。 byte[]を使うと、最初の32ビットから簡単なハッシュコードを計算するのが簡単になります。

+1

お返事ありがとうございます。 groovy 'new BigInteger(1、digest).toString(16).padLeft(32、 '0')'は 'byte []'からハッシュを生成することができます。 BigIntとStringのどちらかを選択しなければならない場合は、何をお勧めしますか?これは単なるスクリプトであり、ラッパーを作成することは過度の可能性があるため(これは大きなパフォーマンス上の利点はありません)、これを求めています。 – kunal

+1

@kunal、bigintとstringの間で強制的に選択すると、BigIntegerが選択されます。一連の16進数字を素朴に文字列として保存すると、文字列はスペース効率が悪くなります。あなたはビットをUTF-16コード単位にパックすることができますが、厄介な理由はありません。すべての作業のために保存するのは、BigIntegerを超える16bです。 –

+0

もう一度お返事ありがとうございます。 @ericksonが述べたように、それを長く保存するのはどうですか? – kunal

0

多くの比較を実行する必要がある場合は、MD5値を2 longの整数として保存することができます。これにより、最大で4つの論理演算を実行して別のMD5値をチェックするだけで済みます。基本的

、入力を受け入れるクラス、生がbyte[]としてデータをダイジェストと

ByteBuffer bb = ByteBuffer.wrap(digestData); 
long[] bits = new long[] { 
    bb.getLong(), 
    bb.getLong() 
}; 

boolean eq = ((bits[0]^otherBits[0]) | (bits[1]^otherBits[1])) == 0); 

でMD5を再構築して、別の long[] MD5配列との比較を使用することを提供します
ByteBuffer bb = ByteBuffer.allocate(16); 
bb.putLong(bits[0]); 
bb.putLong(bits[1]); 

byte[] digestData = new byte[16]; 
bb.get(digestData); 

:すべての比較でをlong[]に変換することを推奨していません。これはの比較でダイジェストを保存する方法です。最後の再構成スニペットはオプションです。データをbyte[]のままにして、long[]アレイのみを比較する必要があります。データベースでは、データを32バイトの16進値として格納します。

+0

-1:longは、JVMに関係なく常に64ビットです。そして、これらのすべての変換の必要はありません。 Long.SIZEは定数です。それをチェックすることは意味がありません。これをバイト配列として格納し、java.util.Arrays.equals(byte []、byte [])を使用します。 –

+0

うーん...私はCクラスに汚染されていたに違いない...答えを修正する。 –

+0

@JB Nizel、パフォーマンスの質問とArrays.equals(byte []、byte [])のチェックは、私が提案しているチェックを行うよりも効率が悪いです。 APIは便宜上存在しますが、通常はほとんどの場合Java APIを提案していますが、ここでは該当しません。 –

1

Javaの速度を比較すると、2つの値をlongとして保存する方が高速になる可能性があります。永続性のために、データベースと永続性ツールでサポートされている場合は、バイト配列としての格納が最も適しています。それ以外の場合、16進数またはBase-64 –エンコードされたテキストのストレージはかなり一般的であり、同じデータベースにアクセスする他のアプリケーションとうまく連携します。

関連する問題