Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-4857

Java field hash code implementation inconsistent with equals.

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 0.12.0
    • 0.13.0
    • Java - Library
    • None

    Description

      The TField hash code implementation is inconsistent with equals, which is a breaking bug. If you know what hash codes are and are familiar with the Java Object API, then you already know what I'm talking about. Basically Java requires that, if you overriden hashCode() and equals(), then for any two objects that are equal they must return the same hash code.

      The TField class API contract isn't clear about what is considered equality, but according to the TField.equals() implementation, fields are equal if and only if:

      • Both objects are a TField (I'm generalizing here; there's another subtle bug lurking with class checking, but that's another story).
      • The fields both have the same type and id.

      In other words, fields are equal without regard to name. And this follows the overall Thrift architecture, in which field names are little more than window dressing, and the IDs carry the semantics.

      Unfortunately TField.hashCode() includes the name in the hash code calculation! This completely breaks the Object contract. It makes the hash code inconsistent with equality. To put it another way, two fields foo and bar could have the same type and ID, and foo.equals(bar) would return true, but they would be given different hash codes!!

      This is completely forbidden, and means that with this bug you cannot use a TField as the key in a map, for example, or even reliably keep a Set<TField> of fields! If you were to store foo and bar as keys in a map, for example, the different hash codes would put them in different buckets, even though they were considered equal, providing inconsistent and strange lookup results, depending on the name of the field you used to query with.

      This is simply broken as per the Java Object API contract.

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            jking3 James E. King III
            garretwilson Garret Wilson
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 20m
                20m

                Slack

                  Issue deployment