欢迎!请参阅关于页面,以了解更多关于该功能的信息。
c.c/hash 总是使用 hashCode 来处理 java 集合,这与使用 Murmur3 的 Clojure 集合不兼容。
user=> (== (hash (java.util.ArrayList. [1 2 3])) (hash [1 2 3])) false user=> (= (java.util.ArrayList. [1 2 3]) [1 2 3]) true
一种解决方法是,在 Util/hasheq 中添加一个特殊的案例来处理 java.util.Collections,就像现在对 String 一样。
关于此主题在 Clojure 群组中的讨论链接:https://groups.google.com/forum/#!topic/clojure/dQhdwZsyIEw
评论者:alexmiller
补丁前等价的计时是多少?
如果我们使用 instanceof 而不是覆盖 hasheq 来对不同的类型进行测试呢?
评论者:michalmarczyk
重载方法会在静态中解析,因此在 Object 重载中测试类型是无法避免的。
在提供类型提示或文字的情况下,可以使用更具体的重载来加速其对参数类型的哈希处理,因为编译器会根据适当的编译时信息调用该重载。然而,在哈希图/集合操作中的“隐式”哈希处理并不会带来任何加速。
评论者:[email protected]
这在我将 Factual/skuld 从 1.5.1 升级到 1.6 时出现。clojure.data.fressian 将 c.l.PersistentHashSet 集合序列化为 java.util.HashSet。这破坏了在 https://github.com/Factual/skuld/blob/b720feb142e6d274e85be208dc1d6d8634801719/test/skuld/net_test.clj#L8-L29 中的相等检查,因为我们比较的集合包含一个 PersistentSet,而序列化和反序列化后的含有一个 HashSet。
这个问题又出现了一次,详细信息见 http://dev.clojure.org/jira/browse/DFRS-7
评论者:mpenet
今天这个问题也困扰了我一番(在找到解决办法之前浪费了很多时间)。我们会不会为1.7版本提供一个补丁?
据我所知,我们仍在寻找一种具有可容忍性能影响的方案,以此为基础才能考虑这个方案。
虽然我们不反对解决这个问题,但我们不希望以牺牲更重要的比较性能为代价来处理这个问题,并且目前的任何建议都无法达到这个标准。目前,我将这个问题移至待办事项,如果出现解决方案则会将其拉出来。