如何将Long ID散列为整数id是安全的?

时间:2015-05-13 21:54:00

标签: java hibernate

我无法提出比这更好的解决方案。

简单的例子:我吃饭。每餐都有描述,但有不同的语言。这就是MealDescription由主键(MealId, LanguageId)组成的原因。到现在为止还挺好。

This guide这里告诉我,我必须实施equals()hashCode(),但这样做是否安全:

@Override
public int hashCode() {
    return (int) mealId.hashCode() + languageId.hashCode();
}

如果mealIdlanguageId实际上属于Long类型,就像它们是ids一样吗?

我所指的指南也是如此:

private String name;
private long id;
// ..
public int hashCode() {
    return (int) name.hashCode() + id; 
}

那怎么办呢?

3 个答案:

答案 0 :(得分:2)

原则上,哈希不像对象那么多样化。您可以将两个或多个对象映射到同一个哈希。始终从0

返回hashCode()甚至是合法的(尽管非常糟糕)

另一个例子,无论消息有多长,MD5散列都是128位。

答案 1 :(得分:2)

永远记住:return 0 总是 hashCode()的有效实施。 Hash代码不是假设是唯一的,这个实现就可以了。

或多或少,来自hashCode实现的想要只是搞乱数字,直到你得到一些快速计算,int形状,确定性基于输入,否则尽可能凌乱。这是一个非常好的实现。

答案 2 :(得分:0)

如果您的mealId / languagIdLong,为什么使用他们的hashCode()会出现问题?这种情况每天都发生在很多Java代码中。哈希斯总是比它们所源自的物体更短。 “希望”的事情是碰撞的风险很小,并且通过添加两个哈希来增加或减少风险。

所以,TL; DR,是的,这是安全的。

干杯,