RFR [16/java.xml] 8246816: XMLGregorianCalendar.hashCode() produces far too many identical hashes
Joe Wang
huizhe.wang at oracle.com
Fri Aug 7 19:13:53 UTC 2020
Hi Naoto,
Why not :-). I kept it to go with equals(). Removing both now. Added a
reference comparison as did in the Impl class.
http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev_04/
Joe
On 8/7/20 10:50 AM, naoto.sato at oracle.com wrote:
> Hi Joe,
>
> If the new XMLGregorianCalendarImpl.hashCode() just calls
> super.hashCode(), could it be removed entirely? Also
> XMLGregorianCalendarImpl.equals() seems to do the same thing as its
> parent. Could it also be removed?
>
> Naoto
>
> On 8/7/20 10:16 AM, Joe Wang wrote:
>> Naoto, Roger,
>>
>> Sorry have to come back with another iteration. It looks like the
>> addition of getMillisecond() over the original implementation does
>> change things.
>>
>> In particular, getMillisecond() returns FIELD_UNDEFINED when
>> fractionalSecond == null (or not specified). But the normalization
>> process will set it to zero after a mathematics adjustment. Now this
>> will fail when comparing with a datetime that does not need to be
>> normalized and thereby still returns FIELD_UNDEFINED (FIELD_UNDEFINED
>> = Integer.MIN_VALUE). This situation is demonstrated in tests 3 at
>> line 56 and 4 at line 58.
>> <http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev_03/test/jaxp/javax/xml/jaxp/unittest/datatype/HashCodeTest.java.html>
>>
>> The culprit is XMLGregorianCalendarImpl::normalizeToTimezone. In the
>> original implementation, XMLGregorianCalendarImpl was calling the
>> private normalizeToTimezone while XMLGregorianCalendar the public
>> normalize(). The later will do the right thing to set the Millisecond
>> back to UNDEFINED.
>>
>> In webrev_03, XMLGregorianCalendarImpl now calls super.hashCode()
>> since the above was the only difference between the hashCode() impls
>> of XMLGregorianCalendarImpl and XMLGregorianCalendar.
>>
>> webrev_03:
>> http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev_03/
>>
>> Thanks,
>> Joe
>>
>>
>> On 8/6/20 1:51 PM, Joe Wang wrote:
>>> Thanks Naoto, Roger! I'll prepare push based on version 01.
>>>
>>> Best,
>>> Joe
>>>
>>> On 8/6/20 1:29 PM, Roger Riggs wrote:
>>>> +1
>>>>
>>>> On 8/6/20 4:18 PM, naoto.sato at oracle.com wrote:
>>>>> Hi Joe, thank you for looking it into further.
>>>>>
>>>>> Yes, I agree the chances of collision is very rare, as
>>>>> sub-millisecond difference in two objects. So fine with the
>>>>> version 01.
>>>>>
>>>>> Naoto
>>>>>
>>>>> On 8/6/20 12:18 PM, Joe Wang wrote:
>>>>>> Thanks Naoto, Roger for the review!
>>>>>>
>>>>>> For Naoto's concern about the equals method using EonAndYear and
>>>>>> FractionalSecond, I did cut corners using the all int getXXX
>>>>>> method. The rational was: it fulfills the equals-hashcode
>>>>>> contract just fine, is consistent with the existing
>>>>>> implementation, and concise. This API was introduced since 1.5,
>>>>>> but I have yet to see any usage of EonAndYear, and very rarely
>>>>>> FractionalSecond. The chances collisions occur due to these
>>>>>> differences are very low.
>>>>>>
>>>>>> But I understand your concern. To be precise or exact as
>>>>>> equals(), we would need to call getFractionalSecond and
>>>>>> EonAndYear. Here's what that would look like:
>>>>>> http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev_02/
>>>>>>
>>>>>> To me, I like version 1 for the reasons above:
>>>>>> http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev_01/
>>>>>>
>>>>>> What would you think?
>>>>>>
>>>>>> Regards,
>>>>>> Joe
>>>>>>
>>>>>> On 8/5/20 6:13 PM, naoto.sato at oracle.com wrote:
>>>>>>> Hi Joe,
>>>>>>>
>>>>>>> For the consistency with equals(), just wondering if the
>>>>>>> sub-second element should be obtained with getFractionalSecond()
>>>>>>> instead of getMillisecond(), as the equals() subsequently calls
>>>>>>> it in internalCompare() method. Also should it call
>>>>>>> getEonAndYear() appropriately for the year?
>>>>>>>
>>>>>>> Naoto
>>>>>>>
>>>>>>> On 8/5/20 4:37 PM, Joe Wang wrote:
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> Please review a fix for the hashCode generation.
>>>>>>>>
>>>>>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8246816
>>>>>>>>
>>>>>>>> webrev: http://cr.openjdk.java.net/~joehw/jdk16/8246816/webrev/
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Joe
>>>>>>>>
>>>>>>
>>>>
>>>
>>
More information about the core-libs-dev
mailing list