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

欢迎!请参阅关于页面以了解有关此操作的更多信息。

0投票
Clojure

对于Sun/Oracle JDK和IBM JDK 1.6,我们有以下内容

user=> (.hashCode 9223372039002259457N) 1

对于IBM JDK 1.7和1.8,它变为以下内容(我不知道为什么)

user=> (.hashCode 9223372039002259457N) 33

这导致当在这些IBM JDK版本上运行时,Clojure中的一些基于例子的测试失败。这里似乎没有Clojure的任何错误。这些测试是用具有不同但具有相同ハッシュ値的特定常数编写的,以测试Clojure在case语句中选择分支生成的代码。特别是,以下control.clj中的这些测试失败

`
;;Clojure 1.6.0和1.7.0-master-SNAPSHOT中第386行,截至2015年3月19日

(is (== (.hashCode 1) (.hashCode 9223372039002259457N)))

;;以及在相同文件的第423行之后
(testing "测试哈希冲突警告"

(should-print-err-message
 #"Performance warning, .*:\d+ - hash collision of some case test constants; if selected, those entries will be tested sequentially..*\r?\n"
 (case 1 1 :long 9223372039002259457N :big 2)))

`

同一文件中还有其他使用相同常数9223372039002259457N且未失败的测试,但它们没有如预期那样测试哈希冲突。

可能改变的几种可能性

  1. 在IBM JDK 1.7和1.8上运行测试时,选择除1和9223372039002259457N之外的不同成对数字,使得哈希值冲突。例如,33和9223372039002259457N。

  2. 完全跳过这些在IBM JDK 1.7和1.8上运行的测试。

2个答案

0投票

评论由:alexmiller

我认为我更愿意在ibm jdk上跳过这些测试。

0投票
参考:https://clojure.atlassian.net/browse/CLJ-1678(由jafingerhut报告)
...