Clojure 2024 调查问卷中分享您的想法!

欢迎!请查看关于页面以了解更多关于如何使用本服务的详细信息。

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添加一个特殊情况,就像它现在对Strings所做的那样。

关于这个话题在Clojure群组的讨论链接: https://groups.google.com/forum/#!topic/clojure/dQhdwZsyIEw

43 答案

0
_由:michalmarczyk_发表的评论

为了完整性,直接在{{hasheq}}中根据{{Map}}、{{Set}}等进行分支,就像Jozef的原始补丁那样,在我上一条评论中引入的微基准测试中导致如下时间:

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

不包含{{Map.Entry}}检查的新补丁(0006);在{{Murmur3}}类中引入了两个方法来处理j.u.maps。

Java映射条目并未真正集成到Clojure中 -- 您不能像使用向量一样使用它们,不能在它们上调用{{seq}}等 -- 所以只要j.u.maps做,我认为它们不需要在hasheq中与Clojure映射条目匹配。

时间

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

在内部检查Map/可迭代的对象似乎并不会对xor基准测试结果产生很大影响,但会使juhm哈希更快。这对我的确是个惊喜。无论如何,这里有一个新的补丁(0007)以及相应的计时结果

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

评论者:alexmiller

没有补丁的等效时间是什么?

0
_由:michalmarczyk_发表的评论

这些在介绍基准测试的评论中的表格中有列出 —— xor为148.128748纳秒,juhm为1.701640微秒。
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
答:
...