Вопрос

Since I don't have any great skills in math, I ask you if there exists any algorithm that I should use for a class which probably will change in the future.

Consider following scenario:

Class "Roles" has following fields:

private boolean admin;
private boolean printer;

After some weeks I decide to add a role "guest":

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

After some weeks I decide to remove the role "printer";

private boolean admin;
private boolean guest;

Since I will persist the hashcode in a database, I must be 100% sure that all versions of this class generates unique hashcodes.

Maybe this is not a problem, I have always used the one provided in the Eclispe IDE source generator.

Can you please tell me if I am safe with the Eclipse IDE (Indigo) Java version >= 6 method or give me some other advices regarding this topic. I am sure this is a very common thing.

Thanks in advance

Это было полезно?

Решение

Since I will persist the hashcode in a database

Don't do that. The result of hashCode isn't meant to be persisted. In particular, from the docs:

This integer need not remain consistent from one execution of an application to another execution of the same application.

Next:

I must be 100% sure that all versions of this class generates unique hashcodes.

Hash codes aren't meant to be unique, either... they very often won't be. Okay, you've only got 5 bits of data in your case, but in general that's not the case...

It sounds like you have different requirements from the normal ones for Object.hashCode() - so you shouldn't expect any autogenerated implementation to know about your special requirements. I suggest you state exactly what your requirements are, and we can work out what to do...

Другие советы

To give some idea of the difference between 32 bit hashcodes and UUID's, and how likely a collision is per the Birthday Paradox, this is how many ids you would need to generate to get a 50% chance that two of them have the same value (a collision):

32 bit hashcode - 77,000

128 bit UUID - 22,000,000,000,000,000,000

A hashcode does not promise uniqueness, with collisions to be expected in normal use. UUIDs promise practical uniqueness, where collisions are extremely unlikely in practice.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top