对于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且未失败的测试,但它们没有如预期那样测试哈希冲突。
可能改变的几种可能性
在IBM JDK 1.7和1.8上运行测试时,选择除1和9223372039002259457N之外的不同成对数字,使得哈希值冲突。例如,33和9223372039002259457N。
完全跳过这些在IBM JDK 1.7和1.8上运行的测试。