2012-03-12 9 views
0

私はMD5 JAVAメソッドから16バイトの配列を持っています。 これをlongに変換して、ハッシュキーとして使用したいと考えています。 64ビットをビットごとに排他的論理和(XOR)で読むのは良いアイデアです。 XORとcvtの完全なコード例は長くお願いします。MD5をロングに変換する

+0

あなたはXORルートを取っていた場合は、残りの半分を持つだけでXOR半分のバイトと思い、長い長さ16バイト配列であるの半分のビット数である64ビットであるため。より具体的には、8つの最上位バイトと8つの最下位バイトを排他的論理和(XOR)できます。 –

答えて

4

私が見つけた最高のソリューション(スピードと優れたハッシュ関数の私のニーズに基づいて...ミックス)は、GoogleのCityHashです。入力はMD5結果を含む任意のバイト配列で、出力は符号なし64ビット長です。

CityHashは非常に良いではなく、完全なハッシュ分布を有し、かつ非常に高速です。

私は半分の時間でのC#にC++からCityHashを移植しました。 Javaポートも簡単にする必要があります。 (確かにそれは非常に高速になりますが)

ちょうどビットをXORすることなど良好な分布を与えるものではありません。

私はバイト配列から長いものをどのように埋め込むのかを正確に伝えるためにJavaにはあまりよく慣れていません(よく分からないヘルパーかもしれませんが、Javaの誤った算術の詳細を得ることもできます)。私はendiannessに対処する試みがなされていない

long a = md5[0] * 256 * md5[1] + 256 * 256 * md5[2] + 256 * 256 * 256 * md5[3]; 
long b = md5[4] * 256 * md5[5] + 256 * 256 * md5[6] + 256 * 256 * 256 * md5[7]; 
long result = a^b; 

注:基本的に、しかし、あなたはこのような何かをしたいでしょう。しかし、一貫したハッシュ値を気にするだけであれば、エンディアンは重要ではありません。

+0

CityHashは、javaで利用できないSSE4拡張を広範に使用しています。 –

+0

@Alan:C#でもafaikでも利用できませんが、C#のバージョンはC#からC++バージョンを呼び出すほど正確です(SSE4の喪失は、譲渡や譲渡よりも高価ではありません)。 –

+0

あなたは[グアバのハッシュ]をご覧ください(https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/hash/Hashing.java?name=refs/リモート/ gcode-clone/cityhash) –

2

だけ、暗号ダイジェストがもはや特にこれらの特性がもはや保持、ダイジェストの暗号特性の多くを有する任意のサブセクション明確にする:

  • 反転抵抗(Hを満たすXを求めます( X))
  • 衝突抵抗(Xを求める、Yそのようなグアバそう有する
2

可能な出力の範囲にわたって、H(X)= H(Y))

  • ランダムに分布しています私Hashing capabilities非常に素晴らしい:

    Hashing.md5().hashString(s).asLong(); 
    

    私は上記の実際CityHashですが、関係なく、それはあなたがどんなあなたのハッシュニーズに使用できるハッシュlong型が生成されます信じています。 (私は@Eric J. Javaコードを試しましたが、CityHash 32のように見えます)。

  • 関連する問題