Uploaded image for project: 'Clojure'
  1. CLJ-1364

Primitive VecSeq does not implement equals or hashing methods

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects versions: Release 1.5
    • Fix versions: Release 1.11
    • Labels:
    • Approval:
      Vetted
    • Patch:
      Code and Test

      Description

      VecSeq (as produced by (seq (vector-of :int 1 2 3))) does not implements equals, hashCode, or hasheq and does not play with any other Clojure collections or sequences appropriately in this regard.

      user=> (def rs (range 3))
      user=> (def vs (seq (vector-of :int 0 1 2)))
      user=> rs
      (0 1 2)
      user=> vs
      (0 1 2)
      user=> (.equals rs vs)
      true
      user=> (.equals vs rs)    ;; expect: true
      false
      user=> (.equiv rs vs)
      true
      user=> (.equiv vs rs)
      true
      user=> (.hashCode rs)
      29824
      user=> (.hashCode vs)     ;; expect to match (.hashCode rs)
      2081327893
      user=> (System/identityHashCode vs)  ;; show that we're just getting Object hashCode
      2081327893
      user=> (.hasheq rs)
      29824
      user=> (.hasheq vs)       ;; expect same as (.hasheq rs) but not implemented at all
      IllegalArgumentException No matching field found: hasheq for class clojure.core.VecSeq  clojure.lang.Reflector.getInstanceField (Reflector.java:271)
      

      Approach: Implement Object.hashCode(), Object.equals(), and IHashEq.hasheq() in the primitive vector seq implementation. All of these leverage the prim vec seq itself rather than the underlying prim vec as it was quite a big simpler. The hasheq() impl calls Murmur3/hashOrdered, which takes an Iterable, so Iterable was also implemented using an iterator over the seq.

      Some existing tests were expanded to include coverage of the primitive vec seq.

      Patch: clj-1364.patch

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              alexmiller Alex Miller
            • Votes:
              1 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: