6

オブジェクト、ユーザー、および製品の 2 つのリストがあります。

ユーザーは製品を所有しており、各製品は 1 人のユーザーに関連付けられています

ただし、製品タイプは複数で、別々のユーザーが所有することができます

  • ユーザー: エド、ロブ
  • 製品: コカ、スプライト(1)、スプライト(2)、ビール
  • Ed には Coca と Sprites(1)、Rob Sprites (2) と Beer があります。

一意 (ユーザー + 製品) ごとに ID を生成する必要があります

それはおそらく良い考えではありません

user.hashCode() + product.hashCode()

続行するための良い方法は何ですか?

4

3 に答える 3

7

hashCodeユーザーと製品の両方が疑似ランダム ハッシュ コードを作成しても、それほど悪くはありません。userまたはの hashCode 実装が不適切なためにハッシュの衝突が心配な場合はproduct、ソース ハッシュ コードの 1 つに素数を掛けます。

public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((product == null) ? 0 : product.hashCode());
  result = prime * result + ((user == null) ? 0 : user.hashCode());
  return result;
}

[ソース] | [ソース]を選択すると、Eclipse はまさにこのコードをビルドします。hashCode() と equals() を生成します。

Thilo が述べたように、単純にArrays.hashCode(new Object[]{ user, product });を使用することもできます。この呼び出しはnull、ユーザーまたは製品の値を処理し、結果に 31 を掛けます (手書きのコードと同じ)。Google Guava を使用している場合Objects.hashCode(Object...)、意図を少し明確にして varargs を使用する がありますが、これは に委任するだけArrays.hashCodeです。

于 2012-04-20T09:39:54.880 に答える
5

ApacheCommonsHashCodeBuilderに作業を任せることができます。

それはあなたが次のようなものを書くことを可能にします

return new HashCodeBuilder(17, 37).
   append(user).
   append(product).
   toHashCode();
于 2012-04-20T09:40:16.657 に答える
1

一般的な解決策は、最初のハッシュに素数を掛けてから、2 番目のハッシュを足すことです。

于 2012-04-20T09:39:17.740 に答える