衝突なし整数配列のための計算ハッシュへの最速の方法

Naethilis:

Javaメソッド、をArrays.hashCode()またはObjects.hash()は、次のような異なるコンテンツである整数アレイの同一のハッシュを返します

Integer[] a = {0,4,5,0}     // hash 927520
Integer[] b = {0,3,36,0}    // hash 927520

同じ結果は、カスタムhashCodeメソッドなどで返されます。

public int hash(final Integer[] indexes) {
    final int prime = 31;
    int result = 1;
    for (Integer i : indexes) {
        result = prime * result + ((i == null) ? 0 : i.hashCode());
    }
    return result;
}

私は、これは正常な動作であることに同意します。しかし、私は内容が異なっているとして、彼らのために個別のハッシュコードを生成します。

以下のための計算ハッシュへの最速の方法は何ですか衝突なし整数配列は、

ユージン:

問題は少し異なっています。まず考えるなぜあなたが必要とするhashCode、高速(ER)は、ルックアップのために=で開始します。それはまだ彼らが同じであるという意味ではありませんので、同じハッシュ値を生成する2つのオブジェクトを持つことは、(あなたはまだに対してチェックだろうもちろん、まったく問題ありませんequals)。

あなたは、私はちょうどあなたが(あなたは、単にそれらを知らないかもしれない)については考えていないことをいくつか面白いものを追加したい、これが不可能であることを言って、あなたの質問の下で、すでにいくつかのコメントがあります。

一般的には、hash collisionsあなたが想像するかもしれないことをはるかに頻繁にJavaのデータ構造です。よると、誕生日の問題と考慮していることをhash実際にされ32 bits、我々はそれがかかるだろうという事実のために取得する唯一の77164がある前に、一意の値を50%、衝突を生成するためのチャンスは(そしてそれが最良の場合です)。衝突が罰金以上ですので。ことではあるが、言っJEPは( -ハッシュを行うことによって最初に私の理解では、これを改善するためにlong、しかし深くくらいに潜っていないとことを離れて働い)。

今、あなたはそのハッシュ衝突は、より微細な知っていることを、それらが使用されている理由を考えます。基本的には、高速(ER)ルックアップのために。同じを持っている2つのエントリが存在する場合hash、それは彼らがバケツであることを、同じ「バケツ」にし、Javaで終了することを意味し、完全バランス赤黒木(のためにHashMap、これとHashSet) -見たときに、超高速のままであることエントリの。このように、一般的には、任意のハッシュベースの構造は、検索時間がある定数(すなわち:償却をO(1))、ハッシュ衝突を心配しないようにします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=190799&siteId=1
おすすめ