可扩展类的哈希代码(未来证明)

时间:2012-08-03 19:00:11

标签: java math hashcode hash-function

由于我没有很好的数学技能,我问你是否有任何算法我应该用于一个可能在将来改变的课程。

请考虑以下情况:

Class“Roles”包含以下字段:

private boolean admin;
private boolean printer;

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

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

几周后我决定删除角色“printer”;

private boolean admin;
private boolean guest;

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

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

请告诉我,如果我对Eclipse IDE(Indigo)Java版本> = 6方法安全,或者给我一些关于此主题的其他建议。我相信这是一件很平常的事情。

提前致谢

2 个答案:

答案 0 :(得分:12)

  

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

不要那样做。 hashCode的结果不是意味着被保留。特别是来自文档:

  

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

下一步:

  

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

哈希代码并不是唯一的......它们通常不会。好的,你的案例中只有5位数据,但一般情况并非如此......

听起来你对Object.hashCode()的正常要求有不同的要求 - 所以你不应该期望任何自动生成的实现知道你的特殊要求。我建议您说明完全您的要求是什么,我们可以找出要做的事情......

答案 1 :(得分:2)

为了了解32位哈希码和UUID之间的区别,以及每Birthday Paradox的冲突的可能性,这就是你需要生成多少个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