Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining Java hashcodes into a "master" hashcode

Tags:

I have a vector class with hashCode() implemented. It wasn't written by me, but uses 2 prime numbers by which to multiply the 2 vector components before XORing them. Here it is:

    /*class Vector2f*/ ...     public int hashCode()     {         return 997 * ((int)x) ^ 991 * ((int)y); //large primes!      } 

...As this is from an established Java library, I know that it works just fine.

Then I have a Boundary class, which holds 2 vectors, "start" and "end" (representing the endpoints of a line). The values of these 2 vectors are what characterize the boundary.

    /*class Boundary*/ ...     public int hashCode()     {         return 1013 * (start.hashCode()) ^ 1009 * (end.hashCode());     } 

Here I have attempted to create a good hashCode() for the unique 2-tuple of vectors (start & end) constituting this boundary. My question: Is this hashCode() implementation going to work?

(Note that I have used 2 different prime numbers in the latter hashCode() implementation; I don't know if this is necessary but better to be safe than sorry when trying to avoid common factors, I guess -- since I presume this is why primes are popular for hashing functions.)

like image 572
Engineer Avatar asked May 31 '10 11:05

Engineer


People also ask

What happens if Hashcode for multiple keys is same?

HashCode collisionsWhenever two different objects have the same hash code, we call this a collision. A collision is nothing critical, it just means that there is more than one object in a single bucket, so a HashMap lookup has to look again to find the right object.

Can 2 strings generate the same Hashcode?

Two same strings/value must have the same hashcode, but the converse is not true. There might be another string which can match the same hash-code, so we can't derive the key using hash-code. The reason for two different string to have the same hash-code is due to the collision.

Can two values have same Hashcode in Java?

It is perfectly legal for two objects to have the same hashcode. If two objects are equal (using the equals() method) then they have the same hashcode. If two objects are not equal then they cannot have the same hashcode.

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.


1 Answers

That's the normal practice. It looks pretty reasonable to me. If you're using Eclipse, you should find that it can generate equals and hashCode for you—just check the Source menu. It will do the same thing—enumerate your fields and create an equals method that checks all of them, then choose n prime numbers and do what you've done to create a hashCode method.

like image 117
Samir Talwar Avatar answered Oct 09 '22 11:10

Samir Talwar