as specified by AMOP.
* optimization: faster LOGCOUNT implementation on x86 and x86-64
(thanks to Lutz Euler)
+ * optimization: hashing of general arrays and vectors has been
+ improved. (reported by Any Fingerhut)
* fixed bug #337: use of MAKE-METHOD in method combination now works
even in the presence of user-defined method classes. (reported by
Bruno Haible and Pascal Costanza)
(declaim (ftype (sfunction (t) (integer 0 #.sb!xc:most-positive-fixnum))
sxhash-instance))
+(defmacro hash-array-using (recurse array depthoid)
+ ;; Any other array can be hashed by working with its underlying
+ ;; one-dimensional physical representation. Used by both SXHASH and
+ ;; PSXHASH.
+ (once-only ((array array) (depthoid depthoid))
+ `(let ((result 60828123))
+ (declare (type fixnum result))
+ (dotimes (i (min ,depthoid (array-rank ,array)))
+ (mixf result (array-dimension ,array i)))
+ (dotimes (i (min ,depthoid (array-total-size ,array)))
+ (mixf result
+ (,recurse (row-major-aref ,array i) (- ,depthoid 1 i))))
+ result)))
+
(defun sxhash (x)
;; profiling SXHASH is hard, but we might as well try to make it go
;; fast, in case it is the bottleneck somwhere. -- CSR, 2003-03-14
;; work needs to be done using the %RAW-BITS
;; approach. This will probably do for now.
(sxhash-recurse (copy-seq x) depthoid))
- (t (logxor 191020317 (sxhash (array-rank x))))))
+ (t
+ (hash-array-using sxhash-recurse x depthoid))))
(character
(logxor 72185131
(sxhash (char-code x)))) ; through DEFTRANSFORM
;;(format t "~&SIMPLE-VECTOR special case~%")
(frob))
(t (frob)))))
- ;; Any other array can be hashed by working with its underlying
- ;; one-dimensional physical representation.
(t
- (let ((result 60828))
- (declare (type fixnum result))
- (dotimes (i (min depthoid (array-rank key)))
- (mixf result (array-dimension key i)))
- (dotimes (i (min depthoid (array-total-size key)))
- (mixf result
- (psxhash (row-major-aref key i)
- (- depthoid 1 i))))
- result))))
+ (hash-array-using psxhash key depthoid))))
(defun structure-object-psxhash (key depthoid)
(declare (optimize speed))