Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hash Codes for Floats in Java

I have a class with two float variables and hashCode method (without equals in current code snippet):

public class TestPoint2D {
    private float x;
    private float z;

    public TestPoint2D(float x, float z) {
        this.x = x;
        this.z = z;
    }

    @Override
    public int hashCode() {
        int result = (x != +0.0f ? Float.floatToIntBits(x) : 0);
        result = 31 * result + (z != +0.0f ? Float.floatToIntBits(z) : 0);
        return result;
    }
}

The following test

@Test
public void tempTest() {
    TestPoint2D p1 = new TestPoint2D(3, -1);
    TestPoint2D p2 = new TestPoint2D(-3, 1);

    System.out.println(p1.hashCode());
    System.out.println(p2.hashCode());
}

returns same values:

-2025848832

In this case I can't use my TestPoint2D within HashSet / HashMap

Can anyone suggest how to implement hashCode in this case or workarounds related to this?

P.S. Added one more test:

@Test
public void hashCodeTest() {
    for (float a = 5; a < 100000; a += 1.5f) {
        float b = a + 1000 / a; // negative value depends on a
        TestPoint3D p1 = new TestPoint3D(a, -b);
        TestPoint3D p2 = new TestPoint3D(-a, b);
        Assert.assertEquals(p1.hashCode(), p2.hashCode());
    }
}

And it is passed that proves that

TestPoint2D(a, -b).hashCode() == TestPoint2D(-a, b).hashCode()

like image 702
davs Avatar asked Oct 26 '25 06:10

davs


1 Answers

I would use Objects.hash():

public int hashCode() {
   return Objects.hash(x, z);
}

From the Javadoc:

public static int hash(Object... values)

Generates a hash code for a sequence of input values. The hash code is generated as if all the input values were placed into an array, and that array were hashed by calling Arrays.hashCode(Object[]). This method is useful for implementing Object.hashCode() on objects containing multiple fields. For example, if an object that has three fields, x, y, and z, one could write:

like image 158
dustinroepsch Avatar answered Oct 28 '25 20:10

dustinroepsch