2012-04-22 14 views
3

長さ128文字のブール文字列(「01100..001」など)(128個の0/1を意味します)があります。私は、Javaで効率的な(高速な)ハッシュ関数を探しています。これは、128ビットよりはるかに低い表現を生み出します。誰も私を助けることができる、そのようなハッシュ関数はありますか?なにか提案を ?Javaの最速ハッシュ関数

+3

128ビット表現で得られるゼロよりも衝突が少ないですか? – eggyal

+0

@eggyal、ありがとう。ニースのコンセプト。それは私を助けてくれるでしょう。 :) – Arpssss

+0

ストリングを使用して128ビットの値を格納するだけでは、ちょっとした過労、記憶の浪費、特にパフォーマンスに気を配っているようです。 – MRalwasser

答えて

5

Java Stringクラスの.hashCode()メソッドを使用すると、intが返され、非常に高速です。

BitSetにデータを保存することをお勧めする場合は、java.util.BitSet.hashCode()メソッドをPulsarが提案するように使用することができます。

+0

私は 'String'を' BigInteger'に最初に変換し、そのために '.hashCode()'メソッドを呼び出すことを除いて言います。しかし、私はあなたが提案したように元の 'String'をハッシュするほうが速いと推測しています。なぜ16バイトを128バイトの 'String'ファイルとして保存したいのかと疑問に思っています。これはスペースの浪費のようです。 – ZeroOne

+0

ありがとうございました。試してみるといいですね。しかし、衝突の可能性を示す文書はありますか? – Arpssss

+0

@ ZeroOne、私はBigIntに変換してからhashcodeを呼び出すことも考えています。なぜなら、衝突が少なくなるからです。 – Arpssss

7

代わりにjava.util.BitSetを使用することを検討しましたか?あなたは何をしているのかによって、はるかに簡単で効率的になる可能性がありますか? http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html .hashCode()メソッドもあります。

+0

ありがとうございました。試してみるといいですね。しかし、衝突の可能性を示す文書はありますか? – Arpssss

+0

私は気づいていません。私はそれが2004年に改良されたことを知っています(バグパレードを参照してください:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4979028)、ハッシュコードの計算方法をjava doc showもちろん利用可能です。 http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html#hashCode() –

1

文字列のハッシュを計算する必要がある場合は、StringクラスのhashCode()メソッドを使用します。実装に応じて、この値を迅速に計算するための最適化がいくつか行われます。 StringクラスhashCode()方法のOpenJDKの実装例として

は、hash属性の値をキャッシュし、一度だけ計算される必要があります。

128文字の文字列に128ビットのハッシュがあると言ったのは誰ですか? JavaのhashCode()メソッドによって返されるすべてのハッシュは、タイプがintであり、Javaのintsは32ビットを使用して表されます。