5

項目 9 のサンプル コードは次のとおりです。

public final class PhoneNumber {
  private final short areaCode;
  private final short prefix;
  private final short lineNumber;

  @Override
  public int hashCode() {
    int result = 17;
    result = 31 * result + areaCode;
    result = 31 * result + prefix;
    result = 31 * result + lineNumber;
    return result;
  }
}

ページ 48 には次のように記載されています

2 による乗算がビット シフトと同等であるという概念を理解しています。また、大きな数に大きな奇数の素数を掛けると、依然としてオーバーフローが発生する (したがって情報が失われる) こともわかっています。私が得られないのは、大きな奇数素数による乗算から生じる情報損失が、大きな偶数による乗算から生じる情報損失よりも好ましい理由です。

4

2 に答える 2

6

偶数乗数では、乗算後の最下位ビットは常にゼロです。奇数乗数では、最下位ビットは、前の値に応じて 1 または 0 になりますresult。したがって、偶数乗数は下位ビットに関する不確実性を失いますが、奇数乗数はそれを保持します。

于 2012-06-06T13:40:58.987 に答える
1

大きな偶数素数というものはありません - 偶数素数は 2 だけです。

それはさておき - 3 や 5 のような小さなものではなく中規模の素数 # を使用する一般的なポイントは、オーバーフローするかどうかにかかわらず、2 つのオブジェクトが同じハッシュ値になる可能性を最小限に抑えることです。

オーバーフローのリスク自体は問題ではありません。本当の問題は、ハッシュされるオブジェクトのセットに対してハッシュコード値がどのように分散されるかです。ハッシュコードは HashSet や HashMap などのデータ構造で使用されるため、同じハッシュ コードを共有する可能性のあるオブジェクトの数を最小限に抑えて、それらのコレクションの検索時間を最適化する必要があります。

于 2012-06-06T13:40:37.530 に答える