(in-package "SB!IMPL")
+(defun pointer-hash (key)
+ (pointer-hash key))
+
;;; the depthoid explored when calculating hash values
;;;
;;; "Depthoid" here is a sort of mixture of what Common Lisp ordinarily calls
;;;; <http://burtleburtle.net/bob/hash/doobs.html> for some more
;;;; information).
-#!-sb-fluid (declaim (inline %sxhash-substring))
+(declaim (inline %sxhash-substring))
(defun %sxhash-substring (string &optional (count (length string)))
;; FIXME: As in MIX above, we wouldn't need (SAFETY 0) here if the
;; cross-compiler were smarter about ASH, but we need it for
;;;; the SXHASH function
;; simple cases
-(declaim (ftype (sfunction (integer) (integer 0 #.sb!xc:most-positive-fixnum))
- sxhash-bignum))
-(declaim (ftype (sfunction (t) (integer 0 #.sb!xc:most-positive-fixnum))
- sxhash-instance))
+(declaim (ftype (sfunction (integer) hash) sxhash-bignum))
+(declaim (ftype (sfunction (t) hash) sxhash-instance))
(defun sxhash (x)
;; profiling SXHASH is hard, but we might as well try to make it go
;; than this. The problem is that a non-SIMPLE
;; BIT-VECTOR could be displaced to another, with a
;; non-zero offset -- so that significantly more
- ;; work needs to be done using the %RAW-BITS
+ ;; work needs to be done using the %VECTOR-RAW-BITS
;; approach. This will probably do for now.
(sxhash-recurse (copy-seq x) depthoid))
(t (logxor 191020317 (sxhash (array-rank x))))))
'(let ((result 572539))
(declare (type fixnum result))
(mixf result (length key))
- (dotimes (i (length key))
+ (when (plusp depthoid)
+ (decf depthoid)
+ (dotimes (i (length key))
(declare (type fixnum i))
(mixf result
- (psxhash (aref key i)
- (- depthoid 1 i))))
- result))
+ (psxhash (aref key i) depthoid))))
+ result))
(make-dispatch (types)
`(typecase key
,@(loop for type in types
(declare (type fixnum result))
(dotimes (i (array-rank key))
(mixf result (array-dimension key i)))
- (dotimes (i (array-total-size key))
- (mixf result
- (psxhash (row-major-aref key i)
- (- depthoid 1 i))))
+ (when (plusp depthoid)
+ (decf depthoid)
+ (dotimes (i (array-total-size key))
+ (mixf result
+ (psxhash (row-major-aref key i) depthoid))))
result))))
(defun structure-object-psxhash (key depthoid)
(etypecase key
(integer (sxhash key))
(float (macrolet ((frob (type)
- (let ((lo (coerce most-negative-fixnum type))
- (hi (coerce most-positive-fixnum type)))
+ (let ((lo (coerce sb!xc:most-negative-fixnum type))
+ (hi (coerce sb!xc:most-positive-fixnum type)))
`(cond (;; This clause allows FIXNUM-sized integer
;; values to be handled without consing.
(<= ,lo key ,hi)