对于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中的任何错误。这些测试是用特定的不同但具有相等.hashCode值的常量编写的,以测试Clojure生成代码中在case中选择分支。特别是,这些控制.clj中的测试失败
`
;;Clojure 1.6.0和1.7.0-master-SNAPSHOT于2015年3月19日的第386行
(is (== (.hashCode 1) (.hashCode 9223372039002259457N)))
;;以及在同一文件的第423行稍后
(testing "test warn for hash collision"
(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上失败的测试,但它们没有像预期的那样测试哈希冲突。
以下几点可能需要更改
当在IBM JDK 1.7和1.8上运行测试时,选择一个不同的数对,而不是1和9223372039002259457N,这样hash值就会冲突。例如,33和9223372039002259457N。
当在IBM JDK 1.7和1.8上运行时,完全跳过这些测试。