2012-02-14 1 views
0

こんにちは、Javaでカウントブルームフィルタを開発しようとしています。私は花のフィルターについてのほとんどの情報源を実際に検索しました。私が理解していることは、特定の文字列や単語をハッシュ(ハッシュ)すると、ハッシュの結果がその結果の値に内容を格納できるように場所。 しかし、私の大きな疑問は、ハッシング(アルゴリズム)のやり方です。特定の文字列や単語をハッシュすると実際に何が起こりますか?特定の文字列や単語をハッシュしたときに実際に何が起きているのかを教えてください(特定の文字列や単語をハッシュしたときの最終的な値の到着方法など)。私はまた、衝突の可能性もあることを読む。また、結果として得られるハッシュ値がユニークでない理由(さまざまな入力に対して同じハッシュ値が返される理由)を対処できますか?そして、私は本当にハッシュを行うためのコードを書く必要がありますか、ハッシュを行うためにjavaにinbuilt関数がありますか?特定の文字列や単語をハッシュするときに実際に何が起こるか(実際のプロセス)

+0

質問をする前に少し勉強してください。http://en.wikipedia.org/wiki/Hash_function –

+1

ブルームファイターでは、複数のハッシュが必要です。 – UmNyobe

答えて

1

任意のオブジェクトでhashCode()を呼び出すだけで、簡単にハッシュコードを取得できます。 javadocからクラスStringため特に:

公共int型のhashCode()

は、この文字列のハッシュコードを返します。文字列オブジェクトのハッシュコード は、

[0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]として計算されます。 ]

int arithmeticを使用します。s [i]は文字列のi番目の文字、n は文字列の長さ、^はべき乗を示します。 (空の文字列のハッシュ 値はゼロである。)

0

Stringために実行されるコードはこの1つである:従って

public int hashCode() { 
int h = hash; 
    int len = count; 
if (h == 0 && len > 0) { 
    int off = offset; 
    char val[] = value; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 

ハッシュ関数(全単射ではない)であり、異なる入力することができ同じ結果が得られます。これは、関数通常セットIOよりもはるかに大きいまたは複雑です

H: I -> O

である「ハッシュ」

1

ハッシュ関数の基本です。ハッシュテーブルIでは、あなたの要素のクラスは、Oは正の整数のセットです。特に、ブルームフィルタでは、n異なる機能を持っています。ハッシュ関数を開発するには、類似のオブジェクトの異なる特性を抽出する必要があります。例えば、文字列のためにあなたが持つことができます。

  • 最初の文字
  • 特定の文字
  • 多項式h(S) = sum (s(i)*31^i) mod d
として評価文字列の出現回数を

複数のハッシュを使用する場合は、特性の衝突を避ける必要があります。たとえば、number of voyelsnumber of non-voyelsを使用すると、実際には役に立ちません。ハッシュ関数にはいくつかの特徴は、Javaは、あなたが行っている場合は、あなたのクラスは、ハッシュアルゴリズム

public class Employee { 


    // Default implementation might want to use "name" for as part of hashCode 
    private String name; 

    @Override 
    public int hashCode() { 
    // We know that ID is always unique, so don't use name in calculating 
    // the hash code. & hashCode() is an int 
    return id; 
    } 
} 

*を(使用するためのhashCode()メソッドをオーバーライドすることができますwikipedia entry

0

を見て、そこに持っている必要がありますhashCodeをオーバーライドするにはequalsもオーバーライドする必要があります)。

ハッシュコードは、コレクションに格納されたオブジェクトごとに計算されます。 標準アルゴリズムを使用して計算されます。 実際には、オブジェクト単位でhashcodeメソッドをオーバーライドできます。 ハッシュコードメソッドを実装する方法の1つはHashcodeBuilderを使用しています。

これが役に立ちます。この記事に関連したスタックオーバーフローの詳細を検索すると、より説明的な回答が得られます。

関連する問題