对于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的bug。这些测试是用特定常数值编写的,这些值不同,但具有相同的.hashCode值,以测试Clojure生成选择分支的代码。特别是,control.clj中的这些测试失败
`
;; Clojure 1.6.0和1.7.0-master-SNAPSHOT中的第386行(截至2015年3月19日)
(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之外的一对数字,以便哈希值发生冲突。例如,33和9223372039002259457N。
在IBM JDK 1.7和1.8上运行时完全跳过这些测试。