由于我没有很好的数学技能,我问你是否有任何算法我应该用于一个可能在将来改变的课程。
请考虑以下情况:
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方法安全,或者给我一些关于此主题的其他建议。我相信这是一件很平常的事情。
提前致谢
答案 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.aspx和http://en.wikipedia.org/wiki/Universally_unique_identifier