欢迎!请参阅关于页面以了解该运作方式的更多信息。
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添加一个特殊案例,就像现在对字符串所做的那样。
有关此主题在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版本提供一个补丁?
据我所知,在进行这方面的研究之前,我们仍在寻找一种可接受性能影响的方案。
虽然我们不反对解决这个工单,但我们不希望以牺牲我们在比较中更关心的性能为代价来解决它,并且目前没有哪一个建议方案能达到这一标准。现在,我将这个方案归档,如果有解决方案,我将会把它取出来。