Details
-
Type:
Defect
-
Status:
Closed
-
Priority:
Major
-
Resolution: Completed
-
Affects Version/s: Release 1.4, Release 1.5
-
Fix Version/s: Release 1.5
-
Component/s: None
-
Labels:None
-
Patch:Code and Test
-
Approval:Ok
Description
Equality for sets is not consistent with other persistent collections when the hashCode differs:
(= {(Integer. -1) :foo} {(Long. -1) :foo})
=> true
(= [(Integer. -1)] [(Long. -1)])
=> true
(= #{(Integer. -1)} #{(Long. -1)})
=> false
Attached is what I believe to be a basic fix. It removes a hashCode check from APersistentSet.equals. A similar check was removed from APersistentMap in the following commit:
https://github.com/clojure/clojure/commit/b5f5ba2e15dc2f20e14e05141f7de7c6a3d91179
With this patch, set equality works as expected and all tests pass.
My understanding of the implications of this change are limited, so someone more knowledgeable would need to chime in about its correctness.
Attachments
Activity
Justin Kramer
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Description |
Equality for sets is not consistent with other persistent collections when the hashCode differs:
{{(= {(Integer. -1) :foo} {(Long. -1) :foo}) => true (= [(Integer. -1)] [(Long. -1)]) => true (= #{(Integer. -1)} #{(Long. -1)}) => false}} Attached is what I believe to be a basic fix. It removes a hashCode check from APersistentSet.equals. A similar check was removed from APersistentMap in the following commit: https://github.com/clojure/clojure/commit/b5f5ba2e15dc2f20e14e05141f7de7c6a3d91179 With this patch, set equality works as expected and all tests pass. My understanding of the implications of this change are limited, so someone more knowledgeable would need to chime in about its correctness. |
Equality for sets is not consistent with other persistent collections when the hashCode differs:
(= {(Integer. -1) :foo} {(Long. -1) :foo}) => true (= [(Integer. -1)] [(Long. -1)]) => true (= #{(Integer. -1)} #{(Long. -1)}) => false Attached is what I believe to be a basic fix. It removes a hashCode check from APersistentSet.equals. A similar check was removed from APersistentMap in the following commit: https://github.com/clojure/clojure/commit/b5f5ba2e15dc2f20e14e05141f7de7c6a3d91179 With this patch, set equality works as expected and all tests pass. My understanding of the implications of this change are limited, so someone more knowledgeable would need to chime in about its correctness. |
Justin Kramer
made changes -
| Attachment | setequals.diff [ 11668 ] |
Justin Kramer
made changes -
| Attachment | setequals.diff [ 11669 ] |
Timothy Baldridge
made changes -
| Patch | Code [ 10001 ] | Code and Test [ 10002 ] |
| Approval | Vetted [ 10003 ] | |
| Priority | Major [ 3 ] | Minor [ 4 ] |
Timothy Baldridge
made changes -
| Fix Version/s | Release 1.5 [ 10150 ] |
Gary Fredericks
made changes -
| Priority | Minor [ 4 ] | Major [ 3 ] |
Bo Jeanes
made changes -
| Attachment | 0001-CLJ-1106-Use-Util.hasheq-in-hashCode-for-persistent-.patch [ 11825 ] |
Aaron Bedra
made changes -
| Attachment | 0001-Fixing-set-equality.patch [ 11829 ] |
Aaron Bedra
made changes -
| Assignee | Aaron Bedra [ aaron ] |
Stuart Halloway
made changes -
| Approval | Vetted [ 10003 ] | Screened [ 10004 ] |
Rich Hickey
made changes -
| Approval | Screened [ 10004 ] | Ok [ 10007 ] |
Rich Hickey
made changes -
| Resolution | Completed [ 1 ] | |
| Fix Version/s | Release 1.5 [ 10150 ] | |
| Status | Open [ 1 ] | Resolved [ 5 ] |
Stuart Halloway
made changes -
| Status | Resolved [ 5 ] | Closed [ 6 ] |
Can you add some unit tests that fail with the current code but succeed with the change?