我无法提出比这更好的解决方案。
简单的例子:我吃饭。每餐都有描述,但有不同的语言。这就是MealDescription
由主键(MealId, LanguageId)
组成的原因。到现在为止还挺好。
This guide这里告诉我,我必须实施equals()
和hashCode()
,但这样做是否安全:
@Override
public int hashCode() {
return (int) mealId.hashCode() + languageId.hashCode();
}
如果mealId
和languageId
实际上属于Long
类型,就像它们是ids一样吗?
我所指的指南也是如此:
private String name;
private long id;
// ..
public int hashCode() {
return (int) name.hashCode() + id;
}
那怎么办呢?
答案 0 :(得分:2)
0
返回hashCode()
甚至是合法的(尽管非常糟糕)
另一个例子,无论消息有多长,MD5散列都是128位。
答案 1 :(得分:2)
永远记住:return 0
总是 hashCode()
的有效实施。 Hash代码不是假设是唯一的,这个实现就可以了。
或多或少,来自hashCode
实现的想要只是搞乱数字,直到你得到一些快速计算,int
形状,确定性基于输入,否则尽可能凌乱。这是一个非常好的实现。
答案 2 :(得分:0)
如果您的mealId
/ languagId
为Long
,为什么使用他们的hashCode()
会出现问题?这种情况每天都发生在很多Java代码中。哈希斯总是比它们所源自的物体更短。 “希望”的事情是碰撞的风险很小,并且通过添加两个哈希来增加或减少风险。
所以,TL; DR,是的,这是安全的。
干杯,