Value type hash code

David Simms david.simms at oracle.com
Thu Apr 19 08:04:42 UTC 2018


Summary of points raised:

  * Implementation specification: besides the general contract [1],
    implementation doesn't need to be specified
      o this has advantages to JDK and JVM developers to enable change,
        protects users from said future changes
  * Default implementation
      o Javac could provide the default implementation
          + bloats class file forever
      o BSM mechanism described by John enables more flexibility,
        efficiency and better optimization opportunities
          + e.g. BSM may read annotations at lookup time, allowing users
            to decoratively specify which fields and which method for
            handling references
          + may have bootstrapping issues, if so, said JDK classes need
            to implement hashCode themselves
      o Even if the JVM doesn't implement it directly, it shouldn't
        crash or behave erratically
          + JVM: Return 0, -1, 4711, or throw exception (doesn't matter
            given the point above, 0 for argument's sake) ?
  * On the topic of calling reference fields, calling "hashCode()" or
    using "System.identityHashCode()"
      o "System.identityHashCode()" is consistent with
        "Arrays.hashCode(Object[])" [2]
          + Almost meaningless to the user, many think it is a mistake
      o Calling "hashCode()" is consistent with
        "List.hashCode(Object[])" [3]
          + may result in recursion or costly traversal
              # This is fine, user needs to decide what to do by
                supplying their own...
      o BSM method can help user to declare what they prefer

Obviously a similar discussion can be had for "equals()", except this 
issue doesn't really involve the JVM (as hashCode does).

Clearly being able to declaratively control hash/equals deep vs identity 
is very powerful...we'll be prototyping looking for further technical 
issues.


Feel free to call shenanigans if I have something wrong. Agreeing to 
disagree is also an option, and nothing is set in stone, still prototyping.

Thanks for all the feedback !

/David Simms


[1] 
https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#hashCode()
[2] 
https://docs.oracle.com/javase/10/docs/api/java/util/Arrays.html#hashCode(java.lang.Object%5B%5D)
[3] 
https://docs.oracle.com/javase/10/docs/api/java/util/List.html#hashCode()





More information about the valhalla-dev mailing list