<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
The change for JDK-8321429 breaks the hashCode() method of
sun.nio.ch.FileKey.<br>
<br>
Before this change, the hashCode was computed from long values as
follows:<br>
<br>
return (int)(dwVolumeSerialNumber ^ (dwVolumeSerialNumber
>>> 32)) +<br>
(int)(nFileIndexHigh ^ (nFileIndexHigh >>> 32)) +<br>
(int)(nFileIndexLow ^ (nFileIndexLow >>> 32));<br>
<br>
This adds the three 32-bit values for volumeSerialNumber,
fileIndexHigh and fileIndexLow, producing a reasonable hash.<br>
<br>
With the change, the hashCode is computed from int values as
follows:<br>
<br>
int h = dwVolumeSerialNumber;<br>
h = h << 31 + nFileIndexHigh;<br>
h = h << 31 + nFileIndexLow;<br>
return h;<br>
<br>
Because << has lower precedence than +, this shifts the serial
number out of h twice and is very likely to return zero.<br>
My test results: serialNumber=0xc8b4b431 indexHigh=0x00240000
indexLow=0x00023be9 h=0x00000000<br>
<br>
This should be reverted to the previous algorithm suitably adjusted
to use the new int values:<br>
<br>
return dwVolumeSerialNumber +<br>
nFileIndexHigh +<br>
nFileIndexLow;<br>
<br>
Simon<br>
<br>
<br>
<br>
<br>
</body>
</html>