Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How is hashCode() calculated in Java

Tags:

java

hashcode

What value does the hashCode() method return in java?

I read that it is a memory reference of an object... The hash value for new Integer(1) is 1; the hash value for String("a") is 97.

I am confused: is it ASCII or what type of value is?

like image 739
Jothi Avatar asked Mar 11 '10 18:03

Jothi


People also ask

How is hashCode calculated in Java HashMap?

In HashMap, hashCode() is used to calculate the bucket and therefore calculate the index. equals() method: This method is used to check whether 2 objects are equal or not. This method is provided by the Object class. You can override this in your class to provide your implementation.

Why does Java use 31 in the hashCode () for string?

The value 31 was chosen because it is an odd prime. If it were even and the multiplication overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is less clear, but it is traditional.

What is hashCode value?

What Does Hash Code Mean? Hash code in . NET framework is a numeric value which helps in identification of an object during equality testing and also can serve as an index for the object. The value contained in the hash code is not permanent in nature.


1 Answers

The value returned by hashCode() is by no means guaranteed to be the memory address of the object. I'm not sure of the implementation in the Object class, but keep in mind most classes will override hashCode() such that two instances that are semantically equivalent (but are not the same instance) will hash to the same value. This is especially important if the classes may be used within another data structure, such as Set, that relies on hashCode being consistent with equals.

There is no hashCode() that uniquely identifies an instance of an object no matter what. If you want a hashcode based on the underlying pointer (e.g. in Sun's implementation), use System.identityHashCode() - this will delegate to the default hashCode method regardless of whether it has been overridden.

Nevertheless, even System.identityHashCode() can return the same hash for multiple objects. See the comments for an explanation, but here is an example program that continuously generates objects until it finds two with the same System.identityHashCode(). When I run it, it quickly finds two System.identityHashCode()s that match, on average after adding about 86,000 Long wrapper objects (and Integer wrappers for the key) to a map.

public static void main(String[] args) {     Map<Integer,Long> map = new HashMap<>();     Random generator = new Random();     Collection<Integer> counts = new LinkedList<>();      Long object = generator.nextLong();     // We use the identityHashCode as the key into the map     // This makes it easier to check if any other objects     // have the same key.     int hash = System.identityHashCode(object);     while (!map.containsKey(hash)) {         map.put(hash, object);         object = generator.nextLong();         hash = System.identityHashCode(object);     }     System.out.println("Identical maps for size:  " + map.size());     System.out.println("First object value: " + object);     System.out.println("Second object value: " + map.get(hash));     System.out.println("First object identityHash:  " + System.identityHashCode(object));     System.out.println("Second object identityHash: " + System.identityHashCode(map.get(hash))); } 

Example output:

Identical maps for size:  105822 First object value: 7446391633043190962 Second object value: -8143651927768852586 First object identityHash:  2134400190 Second object identityHash: 2134400190 
like image 79
danben Avatar answered Sep 20 '22 02:09

danben