Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how is hashCode() implemented in Java

Tags:

java

hash

How is hashCode() implemented?

My assumption is that it uses the object memory location as the initial number (the seed) on which it runs the hash function. However, this is not the case.

I've also looked at Hash : How does it work internally? but it does not answer my question.

Yes I could download the SDK, but before I do that and look at the code, perhaps someone else already has knowledge of it.

Thanks :)

EDIT: I know it should be overridden and such, so please try to stay on topic :)

like image 526
Adrian Avatar asked Apr 11 '12 13:04

Adrian


People also ask

What is default implementation of hashCode in Java?

In Java, hashCode() by default is a native method, which means that the method has a modifier 'native', when it is implemented directly in the native code in the JVM. Used to digest all the data stored in an instance of the class into a single hash value i.e., a 32-bit signed integer.

Why do we need to implement hashCode in Java?

hashCode() returns an integer representing the current instance of the class. We should calculate this value consistent with the definition of equality for the class. Thus, if we override the equals() method, we also have to override hashCode(). For more details, check out our guide to hashCode().


1 Answers

No, no, no. All answers in this thread are wrong or at least only partially correct.

First: Object.hashCode() is a native method, so its implementation depends solely on the JVM. It may vary between HotSpot and other VM implementations like JRockit or IBM J9.

If you are asking:

how is hashCode() implemented in Java?

Then the answer is: it depends on which VM you are using.

Assuming that you are using Oracle's default JVM—which is HotSpot, then I can tell you that HotSpot has six hashCode() implementations. You can choose it using the -XX:hashCode=n flag running JVM via command line, where n can be:

0 – Park-Miller RNG (default)
1 – f(address, global_statement)
2 – constant 1
3 – Serial counter
4 – Object address
5 – Thread-local Xorshift

The above is copied from this post.

And if you dig a little bit around in the HotSpot source code, you may find below snippet:

if (hashCode == 0) {
  value = os::random();
} else {
  ...

os::random() is just the implementation of the Park-Miller Pseudo Random Generator algorithm.

That's all. There isn't any notion of memory address. Although two other implementations, 1 and 4, use an object's memory address, the default one doesn't use it.
The notion that Object.hashCode() is based on the object's address is largely a historic artefact - it is no longer true.


I know that inside Object#hashCode() JavaDoc we can read:

(...) this is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.

But it is obsolete and misleading.

like image 155
G. Demecki Avatar answered Nov 14 '22 22:11

G. Demecki