欢迎!请查看关于页面以获取更多关于这是如何工作的信息。
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添加一个特殊案例,就像现在为Strings所做的那样。
有关这个问题的Clojure组讨论链接: https://groups.google.com/forum/#!topic/clojure/dQhdwZsyIEw
评论者:alexmiller
没有补丁的等效计时是多少?
如果用 instanceof 覆盖 hasheq 为不同类型,而不是使用 instanceof,会怎样?
评论者: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版本提供一个补丁?
据我所知,我们仍在寻找在此问题可被考虑之前,具有可接受性能影响的方法。
虽然我们不反对处理这个任务条目,但我们不想以牺牲我们在比较中更加关注的性能为代价来处理它,且当前的所有提案都没有达到这个标准。因此,我将此任务移至待办事项列表中,但在出现解决方案之前会将其留下。