On Mon, 17 Jul 2023 12:23:17 GMT, Pavel Rappo <[email protected]> wrote:
>> The original code calculated `(37 **
>> nameValue.length)*(37+oid.hashCode)+Arrays.hashCode`; since you already
>> dropped the multiplication, you can also drop the addition.
>
> Thanks for noticing this difference!
>
> Yes, the initial value would've been exponentiated (^ or ** in your
> notation). However, I note that the original code computed this:
>
> if nameValue.length > 0
>
> (37^nameValue.length) * oid.hashCode() + 37 + Arrays.hashCode(nameValue)
>
> otherwise
>
> 37 + oid.hashCode()
>
> Well, it would've computed that, had the multiplier constant been 37 in
> Arrays.hashCode, which it is not; it's 31.
>
> Since we cannot achieve absolute fidelity with the old code, I suggest we do
> this instead, what do you think?
>
> public int hashCode() {
> if (myhash == -1) {
> myhash = Arrays.deepHashCode(new Object[]{oid, nameValue});
> }
> return myhash;
Correction. If the multiplier were 31, then it would've been this:
return ( 30 + oid.hashCode() ) * 31**nameValue.length +
Arrays.hashCode(nameValue);
^ ^
@djelinski, do you think we should use this instead?
return Arrays.deepHashCode(new Object[]{oid, nameValue});
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/14738#discussion_r1265737576