Hi,

specifying a fixed hashCode() algorithm has the important drawback that it prevents evolution.

For example, as you note, String has a strictly specified algorithm [1] that was perhaps a good one in the early days of Java (around 1995) but has shown its deficiencies over the years. In particular, it's easy to construct collisions, which might impact the performance of popular and heavily used hash based data structures, like HashMap and HashSet, under some forms of cyberattack.

Unfortunately, while better String hash algorithms have been proposed, they cannot be adopted, as too much code out there relies on the specific details of String::hashCode. (Even bytecode for switches over String relies on that particular spec.) It's far too late now to change the spec, even for the better.

In retrospect and IMO, fixing String::hashCode in the spec was a (understandable) mistake.


More generally, client code that relies on details of any popular library hashCode() implementation has a dangerous dependency on such details and impairs evolution of the library itself (as the example with String shows).

To leave the door open for better implementations proposed in some future, it is best to avoid specifying the details of hashCode(), as done in Record::hashCode [2] ("Implementation Requirements"). After all, the general contract reads [3]: "This integer [the hash] need not remain consistent from one execution of an application to another execution of the same application."


But what is the use case you have for which you would like a firmly specified Enum::hashCode?


Greetings
Raffaello

----

[1] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#hashCode() [2] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Record.html#hashCode() [3] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode()



On 2022-03-17 13:49, dfranken....@gmail.com wrote:
Dear all,

Currently enums do not have a well-defined hashCode() implementation so
they defer to Object.hashCode() which just uses an internal mechanism
to determine the hashcode, likely based on the object's place in the
heap.

This may confuse a lot of developers as other classes such as String do
have a well-defined hashcode which is consistent across multiple JVM's.

Could it be a good idea to make enums' hashCode() method more reliably
and predictable? For instance by using the hashcode of the name of its
value?

For example:

class MyEnum { A, B }
-> A.hashCode() == A.name().hashCode()

Kind regards,

Dave Franken

Reply via email to