I've already posted here [1] and on the issue board [2] about hashing. In particular, .hashCode for seqs/colls break the Java contract that whenever (.equals x y), (= (.hashCode x) (.hashCode y)). (let x = [1] and y = (seq [1])). As I've mentioned earlier, I hope that eventually .hashCode and .equals will be brought into line. Anyway, I won't rehash (ha ha) this issue further here.
Anyway, I've also since realized that .equals and = are not the same thing, in particular with respect to numbers. So, it might be nice to have a different hash function (i.e., Clojure's "hash"), that matches the behavior of =, and allow the user to specify which hash function they'd like to use when creating hash-sets and hash-maps. (If you know Common Lisp, this idea should be very familiar to you). I think I've already seen at least one instance on the group of someone being thrown off by the fact that two numbers are Clojure = but treated as distinct keys in hash-maps (since they are not .equals to each- other). Actually, I'd be happy with a single type of hashing compatible with = rather than .equals if the idea of multiple flavors is not popular (as I imagine it probably won't be). And, lest you think that confusing = and .equals is just a noobie mistake, let me point out what seems to be a bug in PersistentHashMap.java I just found based on this same confusion. In particular, Objects are located in the map using Clojure's hash function, which is equivalent to .hashCode (and 0 for nil). But, the equality check done on line 561 is done using Util.equal, which is equivalent to Clojure =. Now, suppose that x is a key in the map and we're doing a lookup for y, where (= x y) but (not (.equals x y)). (i.e., x is (Integer. "12") and y is (Long. "12").). Then, the lookup will succeed iff there is a hash collision between x and y, which is presumably not desired behavior. (In fact, I think this will always happen for = Integers and Longs due to the way their hashCodes are defined, but for, e.g., Doubles and Integers it may only happen at a single number (if at all).) -Jason [1] http://groups.google.com/group/clojure/browse_thread/thread/5d11bc0da25a7ecc/06d6cd888a516119?hl=en&lnk=gst&q=.hashcode#06d6cd888a516119 [2] http://code.google.com/p/clojure/issues/detail?id=37&colspec=ID%20Type%20Status%20Priority%20Reporter%20Owner%20Summary --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---
