参与 Clojure 2024 状态调查!分享您的想法:2024 State of Clojure Survey!

欢迎!请参阅关于页面,以了解更多关于该功能的信息。

0
Collections

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

43 答案

0
_Comment made by: michalmarczyk_

为了完整性,直接在 {{hasheq}} 中根据 {{Map}}, {{Set}} 等. 分支,就像 Jozef 的原始补丁一样,在我的上一个评论中引入的微基准测试中的结果如下

|xor|315.866626 ns|
|juhm|18.520133 µs|
0
_Comment made by: michalmarczyk_

新补丁(0006)排除 {{Map.Entry}} 检查;相反,在 {{Murmur3}} 类中引入了两种方法来处理 j.u.maps。

Java 地图条目并没有真正加入到 Clojure 中——你不能像向量一样使用它们,不能调用 {{seq}} 等。-- 因此,只要 j.u.maps 相当,我认为它们不需要在 hasheq 中与 Clojure 地图条目匹配。

计时

|xor|233.341689 ns|
|juhm|9.104637 µs|
0
_Comment made by: michalmarczyk_

检查Map/可迭代的内联似乎对xor基准测试结果影响不大,但使juhm哈希速度更快。这让我感到很惊讶。无论如何,这里有一个新的补丁(0007)和计时结果

|xor|233.062337 ns|
|juhm|8.629149 µs|
0

评论者:alexmiller

补丁前等价的计时是多少?

0
_Comment made by: michalmarczyk_

这些数据在基准测试引入的注释中的表中列出——xor为148.128748 ns,juhm为1.701640 µs。
0

评论者:alexmiller

如果我们使用 instanceof 而不是覆盖 hasheq 来对不同的类型进行测试呢?

0

评论者:michalmarczyk

重载方法会在静态中解析,因此在 Object 重载中测试类型是无法避免的。

在提供类型提示或文字的情况下,可以使用更具体的重载来加速其对参数类型的哈希处理,因为编译器会根据适当的编译时信息调用该重载。然而,在哈希图/集合操作中的“隐式”哈希处理并不会带来任何加速。

0

评论者:[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。

0
by

评论者:[email protected]

这个问题又出现了一次,详细信息见 http://dev.clojure.org/jira/browse/DFRS-7

0
by

评论者:mpenet

今天这个问题也困扰了我一番(在找到解决办法之前浪费了很多时间)。我们会不会为1.7版本提供一个补丁?

0
by

评论者:alexmiller

据我所知,我们仍在寻找一种具有可容忍性能影响的方案,以此为基础才能考虑这个方案。

0
by

评论者:alexmiller

虽然我们不反对解决这个问题,但我们不希望以牺牲更重要的比较性能为代价来处理这个问题,并且目前的任何建议都无法达到这个标准。目前,我将这个问题移至待办事项,如果出现解决方案则会将其拉出来。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1372 (由wagjo报告)
...