【发布时间】:2014-08-23 03:58:45
【问题描述】:
我遇到了一个为 ArrayList 返回的 hashCode 的奇怪问题。下面是修改后的 tuple.clj(来自 Apache Storm 源代码)。传递给 list-hash-code 的列表是一个字符串列表。返回的哈希码使得 (returned-has-code % 6) 始终为 4。即“(mod(.hashCode alist)6)”总是4。我真的很困惑可能出了什么问题。由于这个问题,跨下一个螺栓任务的元组分布不正确。我对这里可能出了什么问题一无所知。我没有看到同样的问题,我从 clojure REPL 运行这些东西。
我如何知道正在使用哪个 hashCode 函数?有没有办法检查 Clojure 的方法细节和 Java 类方法?
(ns backtype.storm.tuple
(:use [backtype.storm bootstrap])
)
(bootstrap)
(defn- print-comma-list [^List els ]
(let [ret (StringBuilder. ) ]
(do
(loop [iter (.iterator els) ]
(when (.hasNext iter)
(.append (.append ret (.next iter)) ",")
(recur iter))))
(.toString ret)))
(defn list-hash-code [^List alist comp-id group-id ]
(do
(if ( and (= comp-id "test1-bolt") ( = group-id "field1,"))
(log-message "Hashcode returned: " (.hashCode alist) " mod val " (mod (.hashCode alist) 6) " " (print-comma-list alist)))
(.hashCode alist)))
【问题讨论】:
标签: java clojure apache-storm