         :else
         inode)))
 
+  (hash-node [_ hash-code]
+    (let [data-len (* (bit-count datamap) 2)
+          len (alength arr)
+          node-start (if (zero? datamap) 0 data-len)]
+      (loop [d 0 hash-code hash-code]
+        (if (< d data-len)
+          (recur (+ d 2) (bit-or (+ hash-code (hash [(aget arr d) (aget arr (inc d))])) 0))
+          (loop [n node-start hash-code hash-code]
+            (if (< n len)
+              (recur (inc n) (.hash-node (aget arr n) hash-code))
+              hash-code))))))
+
   IEquiv
   (-equiv [inode other]
     (if (identical? inode other)

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

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

       (equiv-map coll other))))

  IHash
  (-hash [coll]
    (caching-hash coll persistent-map-hash __hash))

  ILookup
  (-lookup [coll k]
