6

我有两个对象列表,用户和产品

用户拥有产品,每个产品关联到 1 个用户

但是一个产品类型可以是多个并且由不同的用户拥有

  • 用户: Ed, Rob
  • 产品:古柯、雪碧(1)、雪碧(2)、啤酒
  • Ed 有 Coca and Sprites (1)、Rob Sprites (2) 和 Beer

我需要为每个唯一的(用户+产品)生成一个 ID

这可能不是一个好主意

user.hashCode() + product.hashCode()

有什么好的方法可以继续?

4

3 回答 3

7

hashCode如果用户和产品都创建伪随机哈希码,你的情况还不错。如果您因为user或中的错误 hashCode 实现而担心哈希冲突product,则将源哈希码之一乘以素数:

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 在选择Source |时构建了这个非常代码。生成 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

您可以让 Apache Commons HashCodeBuilder为您完成工作。

它可以让你写类似

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

一个常见的解决方案是将第一个散列乘以一个素数,然后加上第二个散列。

于 2012-04-20T09:39:17.740 回答