Sorry, you were right there is no problem overflowing an int.  Wish I
would have known that when writing some other hashCode methods.  Thanks
for adding the braces.

john mcnally

Age Mooy wrote:
> 
> Hmmm... I looked at the implementations of Hashtable and AbstractSet and both of 
>them use this int addition
> scheme. I'm a little rusty on what happens when the number gets too big for an int 
>but I did get some negative
> numbers in my tests. I could cast the whole lot to longs ?
> The only other method I've found while browsing through jdk source code is the 
>bitwise XOR operator... would
> that be sufficient ? Do you have another suggestion ?
> 
> The patch for that last one (incl. fancy brackets) would be:
> 
> Index: src/java/org/apache/turbine/util/db/Criteria.java
> ===================================================================
> RCS file: 
>/home/cvspublic/jakarta-turbine-2/src/java/org/apache/turbine/util/db/Criteria.java,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 Criteria.java
> --- src/java/org/apache/turbine/util/db/Criteria.java   2001/08/16 05:09:46     
>1.1.1.1
> +++ src/java/org/apache/turbine/util/db/Criteria.java   2001/09/27 22:29:07
> @@ -3650,6 +3650,36 @@
>              return isEquiv;
>          }
> 
> +        /**
> +         * Returns a hash code value for the object.
> +         */
> +        public int hashCode()
> +        {
> +            int h = value.hashCode() ^ comparison.hashCode();
> +
> +            if (table != null)
> +            {
> +              h ^= table.hashCode();
> +            }
> +
> +            if (column != null)
> +            {
> +              h ^= column.hashCode();
> +            }
> +
> +            if (and != null)
> +            {
> +              h ^= and.hashCode();
> +            }
> +
> +            if (or != null)
> +            {
> +              h ^= or.hashCode();
> +            }
> +
> +            return h;
> +        }
> +
>          public String[] getAllTables()
>          {
>              StringStackBuffer tables = new StringStackBuffer();
> 
> Age
> 
> > I think you need to be more careful of overflows.
> >
> > john mcnally
> >
> > Age Mooy wrote:
> > >
> > > Hi,
> > >
> > > I was trying to store query results in the global cache service using a key 
>based on the hashcode of the
> > > Criteria object and I found out that hashcodes for equal Criteria are not equal. 
>This breaks the
> > rules because
> > > the Java spec says something like this:
> > >
> > > "If two objects are equal according to the equals(Object) method, then calling 
>the hashCode
> > method on each of
> > > the two objects must produce the same integer result"
> > >
> > > This problem occurs because the Criteria.Criterion inner class defines an 
>equals() method without
> > defining a
> > > matching hashCode() method.
> > >
> > > I played around a bit and came up with this implementation:
> > >
> > > /**
> > >  * Returns a hash code value for the object.
> > >  */
> > > public int hashCode()
> > > {
> > >     int h = value.hashCode() + comparison.hashCode();
> > >
> > >     if (table != null)
> > >       h += table.hashCode();
> > >
> > >     if (column != null)
> > >       h += column.hashCode();
> > >
> > >     if (and != null)
> > >       h += and.hashCode();
> > >
> > >     if (or != null)
> > >       h += or.hashCode();
> > >
> > >     return h;
> > > }
> > >
> > > I'm no hashCode expert but it works consistently with my tests.
> > >
> > > The patch for the above code (in jakarta-turbine-2) is attached below,
> > > Age
> > >
> > > Index: src/java/org/apache/turbine/util/db/Criteria.java
> > > ===================================================================
> > > RCS file: 
>/home/cvspublic/jakarta-turbine-2/src/java/org/apache/turbine/util/db/Criteria.java,v
> > > retrieving revision 1.1.1.1
> > > diff -u -r1.1.1.1 Criteria.java
> > > --- src/java/org/apache/turbine/util/db/Criteria.java   2001/08/16 05:09:46     
>1.1.1.1
> > > +++ src/java/org/apache/turbine/util/db/Criteria.java   2001/09/27 14:11:14
> > > @@ -3650,6 +3650,28 @@
> > >              return isEquiv;
> > >          }
> > >
> > > +        /**
> > > +         * Returns a hash code value for the object.
> > > +         */
> > > +        public int hashCode()
> > > +        {
> > > +            int h = value.hashCode() + comparison.hashCode();
> > > +
> > > +            if (table != null)
> > > +              h += table.hashCode();
> > > +
> > > +            if (column != null)
> > > +              h += column.hashCode();
> > > +
> > > +            if (and != null)
> > > +              h += and.hashCode();
> > > +
> > > +            if (or != null)
> > > +              h += or.hashCode();
> > > +
> > > +            return h;
> > > +        }
> > > +
> > >          public String[] getAllTables()
> > >          {
> > >              StringStackBuffer tables = new StringStackBuffer();
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to