0

ハッシュコード値を決定する方法は?最近、「17は有効なハッシュコードですか?」というインタビューの質問に直面しました。ハッシュコード値を定義するメカニズムはありますか?または、ハッシュコード値に任意の数値を指定できますか?

4

3 に答える 3

3

さまざまなオブジェクトがハッシュ テーブルのさまざまな位置に保存されるように、ハッシュコードは適切に分散されている必要があります (そうしないと、パフォーマンスが低下する可能性があります)。

その時点から、(32 ビットの符号付き整数であるという意味で) 「有効な」ハッシュ コードである一方で、ハッシュ関数がどのように定義されたかは疑わしいものです。

たとえば、文字列をハッシュするための単純なアプローチは、各文字の値を追加するだけです。これにより、単純な文字列 ("tar" と "rat" など、合計すると同じ値になる) に対して同様のハッシュ値が得られます。

一般的なトリックは、単純な入力が異なる値を返すように、各値に小さな素数を掛けることです。

int result = 1;
result = 31 * result + a;
result = 31 * result + b;

また

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

(後者は の JRE 実装からString.hashCode)

于 2013-02-25T06:54:19.393 に答える
0

はい、17完全に有効なハッシュコードです。

ハッシュコードを取得するためにどの方法を選択しても、オブジェクトの状態が同じである限り、常に同じ整数を返す必要があります。

于 2013-02-25T06:54:02.487 に答える
0

や17は有効です。通常、リンクに示されているような素数が使用されます。主キーであるエンティティの ID を使用してハッシュコードを実装できます。

public int hashCode()
{
    int result = 17;
    result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
    return result;
}

これにより、hascode を実装するためのさまざまな方法が提供されます

于 2013-02-25T06:59:03.383 に答える