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

欢迎!请查看关于页面以获取更多关于这是如何工作的信息。

0投票
集合

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

43 答案

0投票
_评论由:michalmarczyk_发表

为了完整性,如Jozef的原始补丁中那样,直接在{{hasheq}}中对{{Map}}、{{Set}}等进行分支,在我的上一次评论中引入的微基准测试中的结果如下

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

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

Clojure中没有真正集成Java映射–您不能像向量一样使用它们,不能在它们上调用{{seq}}等等–因此,只要j.u.maps行得通,我认为它们不需要与hasheq中的Clojure映射匹配。

时间

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

在行内检查 Map/Iterable 对 xor 基准测试的结果似乎没有太大影响,但使 juhm 哈希更快。这对我很意外。无论如何,这里有一个新的补丁(0007)和计时结果

|xor|233.062337 纳秒|
|juhm|8.629149 微秒|
0投票

评论者:alexmiller

没有补丁的等效计时是多少?

0投票
_评论由:michalmarczyk_发表

它们列在介绍基准测试的注释中的表中—xor 为 148.128748 纳秒,juhm 为 1.701640 微秒。
0投票

评论者:alexmiller

如果用 instanceof 覆盖 hasheq 为不同类型,而不是使用 instanceof,会怎样?

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](https://clojure.atlassian.net/browse/CLJ-1372)(由 wagjo 报告)
...