2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关本网站信息的更多内容。

0
Collections

c.c/hash 对 Java 集合始终使用 hashCode,而在与使用 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
_由 michalmarczyk 发表评论:

为了完整性,就像 Jozef 的初始补丁一样,直接在 {{hasheq}} 中分支出 {{Map}}, {{Set}} 等.,在我之前评论中引入的微基准测试中的时间如下

|xor|315.866626 ns|
|juhm|18.520133 µs|
0
_由 michalmarczyk 发表评论:

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

Java 映射条目实际上并没有融入到 Clojure 中—你不能像使用向量一样使用它们,不能在它们上调用 {{seq}} 等. —所以我认为只要 j.u.maps能做到,它们不需要与 Clojure 映射条目在 hasheq 中匹配。

时间

|xor|233.341689 ns|
|juhm|9.104637 µs|
0
_由 michalmarczyk 发表评论:

在行内检查 Map/Iterable 对 XOR 基准测试结果的影响似乎不大,但使 juhm 哈希更快。这让我感到相当惊讶。无论如何,这里有一个新的补丁(0007)和计时信息

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

评论者:alexmiller

在没有补丁的情况下,等效的计时是多少?

0
_由 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

评论者:[email protected]

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

0

评论者:mpenet

今天这个问题依然困扰了我(在解决这个问题之前浪费了很多时间)。我们能否为1.7版本提供一个补丁?

0

评论者:alexmiller

据我所知,我们仍在寻找一种性能影响可接受的方法,在此方法可用之前,这一需求才能被考虑。

0

评论者:alexmiller

虽然我们不反对处理这个问题,但我们不希望以牺牲我们在比较中更关心的性能为代价来处理它,而且目前没有任何一项提议能达到那个标准。目前,我将这个问题移动到待办事项,但如果出现了解决方案,我会将其提取出来。

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