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