Agreed, the shift is a better hashcode. Pushed, thanks
Stephen

On 6 December 2011 10:52, Greg Inozemtsev <g...@nzmsv.com> wrote:
> Hello
>
> I noticed that the latest change to the hashCode for standard duration
> fields introduces collisions in PeriodType.  Because the hashCode of a
> PeriodType is the sum of the hashCodes of its components, a PeriodType
> with a Week and Month will have the same hashCode as one with Seconds,
> and so on.
>
> The following patch makes the hashCode a bitmask, eliminating the
> collisions.  A test is included.
>
>
>
> diff -urp 
> joda-time-2.0.orig/src/main/java/org/joda/time/DurationFieldType.java
> joda-time-2.0/src/main/java/org/joda/time/DurationFieldType.java
> --- joda-time-2.0.orig/src/main/java/org/joda/time/DurationFieldType.java     
>   2011-12-06
> 05:03:22.193579179 -0500
> +++ joda-time-2.0/src/main/java/org/joda/time/DurationFieldType.java    
> 2011-12-06
> 05:46:07.713317900 -0500
> @@ -275,7 +275,7 @@ public abstract class DurationFieldType
>         /** @inheritdoc */
>         @Override
>         public int hashCode() {
> -            return iOrdinal;
> +            return (1 << iOrdinal);
>         }
>
>         public DurationField getField(Chronology chronology) {
> diff -urp joda-time-2.0.orig/src/test/java/org/joda/time/TestPeriodType.java
> joda-time-2.0/src/test/java/org/joda/time/TestPeriodType.java
> --- joda-time-2.0.orig/src/test/java/org/joda/time/TestPeriodType.java  
> 2011-12-06
> 01:56:23.390957347 -0500
> +++ joda-time-2.0/src/test/java/org/joda/time/TestPeriodType.java       
> 2011-12-06
> 05:48:17.881963372 -0500
> @@ -593,6 +593,21 @@ public class TestPeriodType extends Test
>         }
>     }
>
> +    public void testForFields7() throws Exception {
> +        DurationFieldType[] types = new DurationFieldType[] {
> +            DurationFieldType.weeks(),
> +            DurationFieldType.months(),
> +        };
> +        DurationFieldType[] types2 = new DurationFieldType[] {
> +            DurationFieldType.seconds(),
> +        };
> +        PeriodType type = PeriodType.forFields(types);
> +        PeriodType type2 = PeriodType.forFields(types2);
> +        assertEquals(false, type == type2);
> +        assertEquals(false, type.equals(type2);
> +        assertEquals(false, type.hashCode() == type2.hashCode());
> +    }
> +
>     //-----------------------------------------------------------------------
>     public void testMaskYears() throws Exception {
>         PeriodType type = PeriodType.standard().withYearsRemoved();
>
> ------------------------------------------------------------------------------
> Cloud Services Checklist: Pricing and Packaging Optimization
> This white paper is intended to serve as a reference, checklist and point of
> discussion for anyone considering optimizing the pricing and packaging model
> of a cloud services business. Read Now!
> http://www.accelacomm.com/jaw/sfnl/114/51491232/
> _______________________________________________
> Joda-interest mailing list
> Joda-interest@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/joda-interest

------------------------------------------------------------------------------
Cloud Services Checklist: Pricing and Packaging Optimization
This white paper is intended to serve as a reference, checklist and point of 
discussion for anyone considering optimizing the pricing and packaging model 
of a cloud services business. Read Now!
http://www.accelacomm.com/jaw/sfnl/114/51491232/
_______________________________________________
Joda-interest mailing list
Joda-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/joda-interest

Reply via email to