欢迎!请查看 关于 页面以获取有关该功能的一些更多信息。
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
补丁未应用时的等效计时是多少?
如果我们使用typeof而不是instanceof来覆盖hash eq以处理不同的数据类型,会怎样?
评论人:michalmarczyk
重载方法在静态中解析,所以在Object重载中测试类型是不可避免的。
如果给出了类型提示或对于字面量,可以使用更具体的重载来加速给定参数类型的哈希,因为编译器会根据编译时的适当信息发出对该重载的调用。然而,在哈希图/集操作期间的“隐式”哈希中不会有任何加速。
评论人:[email protected]
这在我将Factual/skuld从1.5.1升级到1.6时出现问题。clojure.data.fressian将c.l.PersistentHashSet集合序列化为java.util.HashSet。这破坏了在以下链接中的等价性检查:
这个问题又出现在我面前了,详细信息请见 http://dev.clojure.org/jira/browse/DFRS-7
评论者:mpenet
今天这又让我头疼了很久(在解决这个问题之前浪费了很多时间)。我们能否为1.7版本提供一个补丁呢?
据我所知,我们仍在寻找在此之前可接受的性能影响的解决方案。
虽然我们不反对解决这个问题,但我们也不愿意以牺牲我们更关心的比较性能的代价来解决,而且目前的所有建议都无法达到那个标准。目前,我将其移至“待办事项”列表,但如果出现解决方案,我将将其拉出来。