   (single-kv? [_]
     false)
 
+  (hash-node [_ hash-code]
+    (let [len (alength arr)]
+      (loop [n 0 hash-code hash-code]
+        (if (< n len)
+          (recur (+ n 2) (bit-or (+ hash-code (hash [(aget arr n) (aget arr (inc n))])) 0))
+          hash-code))))
+
   IEquiv
   (-equiv [inode other]
     (if (identical? inode other)

        :else
        inode)))

  IEquiv
  (-equiv [inode other]
    (if (identical? inode other)

                         (and (> idx -1) (= (aget arr (inc i)) (aget other-arr (inc idx))))))
                eq))))))))

(defn- persistent-map-hash [m]
  (mix-collection-hash (if (zero? (.-cnt m)) 0 (.hash-node (.-root m) 0)) (.-cnt m)))

(deftype PersistentHashMap [meta cnt root ^:mutable __hash]
  Object
  (toString [coll]
