Hi.
> [...]
> >>> ---
> >>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/partitioning/utilities/OrderedTuple.java
> >>> (original)
> >>> +++
> >>> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/partitioning/utilities/OrderedTuple.java
> >>> Tue May 29 09:14:37 2012
> >>> @@ -301,12 +301,12 @@ public class OrderedTuple implements Com
> >>> /** {@inheritDoc} */
> >>> @Override
> >>> public int hashCode() {
> >>> - return Arrays.hashCode(components) ^
> >>> - ((Integer) offset).hashCode() ^
> >>> - ((Integer) lsb).hashCode() ^
> >>> - ((Boolean) posInf).hashCode() ^
> >>> - ((Boolean) negInf).hashCode() ^
> >>> - ((Boolean) nan).hashCode();
> >>> + return Arrays.hashCode(components) ^
> >>> + Integer.valueOf(offset).hashCode() ^
> >>> + Integer.valueOf(lsb).hashCode() ^
> >>
> >> As noted in the JIRA, the conversion to Integer is completely
> >> unnnecessary; just use the int value.
> >>
> >>> + Boolean.valueOf(posInf).hashCode() ^
> >>> + Boolean.valueOf(negInf).hashCode() ^
> >>> + Boolean.valueOf(nan).hashCode();
> >>
> >> Similarly here.
> >
> > So you suggest I use somehting like (using different constants for
> > different fields just to spread more the has values):
> >
> > Arrays.hashCode(components) ^ offset ^ (lsb << 7) ^
> > (posInf ? 43422 : 875342) ^ (negInf ? 86535631 : 632442767) ^
> > (nan ? 51108941 : 64234)
> >
> > Would this be more consistent with what you have in mind ?
>
> Yes.
>
> What I suggested was effectively to inline the hashCode() methods for
> Integer and Boolean, i.e. to eliminate the boxing.
>
> That would have resulted in the identical hash code as before.
>
> However, as you point out, the original hash code was probably not
> ideal in that it did not distinguish the fields.
>
> I don't know whether XOR is the best choice for combining the fields.
> LANGs HashBuilder uses multiplication and addition, which is easy to
> extend to any number of fields.
Yes, IIRC the recommended recipe in Bloch's book was something like:
---
int result = 17;
long l = Double.doubleToLongBits(field1);
result = 37 * result + (int)(l ^ (l >>> 32));
l = Double.doubleToLongBits(field2);
result = 37 * result + (int)(l ^ (l >>> 32));
return result;
---
Regards,
Gilles
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]