- (let ((result 408967240))
- (declare (type fixnum result))
- (dotimes (i count)
- (declare (type index i))
- (mixf result
- (the fixnum
- (ash (char-code (aref string i)) 5))))
- result))
+ (macrolet ((set-result (form)
+ `(setf result (ldb (byte #.sb!vm:n-word-bits 0) ,form))))
+ (let ((result 0))
+ (declare (type (unsigned-byte #.sb!vm:n-word-bits) result))
+ (unless (typep string '(vector nil))
+ (dotimes (i count)
+ (declare (type index i))
+ (set-result (+ result (char-code (aref string i))))
+ (set-result (+ result (ash result 10)))
+ (set-result (logxor result (ash result -6)))))
+ (set-result (+ result (ash result 3)))
+ (set-result (logxor result (ash result -11)))
+ (set-result (logxor result (ash result 15)))
+ (logand result most-positive-fixnum))))