0

由于我在数学方面没有任何出色的技能,所以我问你是否有任何算法可以用于将来可能会改变的课程。

考虑以下场景:

“角色”类具有以下字段:

private boolean admin;
private boolean printer;

几周后,我决定添加一个角色“guest”:

private boolean admin;
private boolean printer;
private boolean guest;

几周后,我决定删除“打印机”这个角色;

private boolean admin;
private boolean guest;

由于我会将哈希码保存在数据库中,因此我必须 100% 确定此类的所有版本都会生成唯一的哈希码。

也许这不是问题,我一直使用 Eclispe IDE 源代码生成器中提供的那个。

你能告诉我我是否安全地使用 Eclipse IDE (Indigo) Java 版本 >= 6 方法,或者给我一些关于这个主题的其他建议。我相信这是一件非常普遍的事情。

提前致谢

4

2 回答 2

12

因为我会将哈希码保存在数据库中

不要那样做。的结果hashCode并不意味着要持久化。特别是,来自文档:

该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。

下一个:

我必须 100% 确定这个类的所有版本都会生成唯一的哈希码。

哈希码也不意味着是唯一的……它们通常不会是唯一的。好的,您的案例中只有 5 位数据,但通常情况并非如此......

听起来您的要求与正常要求不同Object.hashCode()-因此您不应期望任何自动生成的实现都知道您的特殊要求。我建议您准确说明您的要求,我们可以制定出该怎么做...

于 2012-08-03T19:03:28.647 回答
2

为了让您了解 32 位哈希码和 UUID 之间的区别,以及根据生日悖论发生冲突的可能性有多大,这是您需要生成多少个 id 才能使它们中的两个有 50% 的机会具有相同的值(碰撞):

32 位哈希码 - 77,000

128 位 UUID - 22,000,000,000,000,000,000

哈希码不保证唯一性,在正常使用中会发生冲突。UUID 承诺实用的唯一性,在实践中极不可能发生冲突。

请参阅http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspxhttp://en.wikipedia.org/wiki/Universally_unique_identifier

于 2012-08-03T20:05:29.327 回答