X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-sxhash.lisp;h=dbe9d23de5549e818ba013102813c697b8479be3;hb=0d5ff04e2ced1cbb2979dd1a7fcfd7ba3d6da7c1;hp=635bf4916c575a7578dc2b09c47cb5eb6e817dbc;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 635bf491..dbe9d23 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -143,9 +143,23 @@ (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 + ;; fast, in case it is the bottleneck somewhere. -- CSR, 2003-03-14 (declare (optimize speed)) (labels ((sxhash-number (x) (etypecase x @@ -201,7 +215,8 @@ ;; 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 @@ -266,18 +281,8 @@ ;;(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))