2016-09-14 3 views
0

Javaの指定されたStringのユニークなハッシュを計算する方法を探しています。私はMD5やSHA1を使うことができないように見えます。なぜなら、人々は彼らが壊れていると主張し、一意性を必ずしも保証しないからです。Javaの指定されたStringからユニークなハッシュを派生/計算する最も良い方法

Iはequals()方法により等しい2つの文字列オブジェクトに対して同じハッシュ(MD5和のような、好ましくは32文字の文字列)を取得しなければなりません。他のStringはこのハッシュを生成しません。それは難しい部分です。

これをJavaで実現する方法はありますか?

+4

:この他の良い答えを確認してください。 32文字の 'String'よりも多くの' String'があります。 – resueman

+0

そうですよ!理論的には不可能です。ありがとう! – rkrishnan

答えて

4

保証された固有のハッシュコードが必要な場合、それは(理論的にではなく、実際に可能)ことはできません。ハッシュとハッシュコードはユニークではありません。長さNの

A Javaの文字列65536^Nの可能な状態を有しており、すべての可能な値を表すために16 * Nビットの 整数を必要とします。 より小さい範囲(例えば、 、16 * Nビット未満)の​​整数を生成するハッシュ関数を記述すると、 より多くの文字列が同じ整数にハッシュされる場合があります。すなわち、ハッシュコードは ユニークであることはできません。これはピジョンホール原理と呼ばれ、 単純な数学的証明があります。

しかし、一意ではない可能性が非常に低い「おそらくユニーク」が であれば、暗号ハッシュは良い答えです。数学は、 に、一意でない可能性のある (十分に低い)確率を達成するためには、ハッシュがどれくらい大きく(つまり、何ビット)あるかを教えてくれます。

更新:あなたは*必ず*いくつかの値との間の衝突があるでしょうWhat is a good 64bit hash function in Java for textual strings?

関連する問題