;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*- ;;; Patch file for System version 126.129 ;;; Reason: ;;; BYTE-specify SXHASH. ;;; Written 23-Oct-88 19:36:43 by keith (Keith Corbett) at site Gigamos Cambridge ;;; while running on Johannes Brahms from band 1 ;;; with Experimental System 126.123, Experimental ZWEI 126.21, Experimental ZMail 74.9, Experimental Local-File 76.0, Experimental File-Server 25.0, Experimental Lambda-Diag 18.0, Experimental Unix-Interface 15.0, Experimental Tape 26.4, Microcode 1762, SDU Boot Tape 3.14, SDU ROM 103, 10/17. ; From modified file DJ: L.SYS; QRAND.LISP#513 at 23-Oct-88 19:37:00 #8R SYSTEM-INTERNALS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS; QRAND  " (DEFUN SXHASH (X &OPTIONAL RANDOM-OBJECT-ACTION) "Return a hash code for object X. EQUAL objects have the same hash code. The hash code is always a positive fixnum. Flavor instances and named structures may handle the :SXHASH operation. The hash code of an object does not change even if it is printed out and read into a different system version." (DECLARE (IGNORE RANDOM-OBJECT-ACTION)) (MACROLET ((ROT-24-BIT (VALUE BITS) (ONCE-ONLY (VALUE BITS) `(DPB ,VALUE (BYTE (- 24. ,BITS) ,BITS) (LSH ,VALUE (- ,BITS 24.)))))) (COND ((SYMBOLP X) (%SXHASH-STRING (SYMBOL-NAME X) #o337)) ((STRINGP X) (%SXHASH-STRING X #o337)) ;Ignores case! ((OR (INTEGERP X) (CHARACTERP X)) (IF (MINUSP X) (LOGXOR (LDB (BYTE 23. 0.) X) 1) (LDB (BYTE 23. 0.) X))) ((CONSP X) ;Rotate car by 11. and cdr by 7, but do it efficiently (DO ((ROT 4) (HASH 0) Y (X X)) ((ATOM X) (OR (NULL X) (SETQ HASH (LOGXOR (ROT-24-BIT (SXHASH X) (IF (< ROT 4) (+ ROT 20.) (- ROT 4))) HASH))) (LOGAND #o37777777 (IF (LDB-TEST (BYTE 1 23.) HASH) (LOGXOR HASH 1) HASH))) (SETQ Y (CAR X) X (CDR X)) (UNLESS (< (SETQ ROT (+ ROT 7)) 24.) (SETQ ROT (- ROT 24.))) (SETQ HASH (LOGXOR (ROT-24-BIT (COND ((SYMBOLP Y) (%SXHASH-STRING (SYMBOL-NAME Y) #o337)) ((STRINGP Y) (%SXHASH-STRING Y #o337)) ((OR (INTEGERP Y) (CHARACTERP Y)) (LDB (BYTE 24. 0.) Y)) (T (SXHASH Y))) ROT) HASH)))) ((TYPEP X 'SINGLE-FLOAT) (LOGXOR (%P-LDB-OFFSET (BYTE 23. 0.) X 1) (%P-LDB-OFFSET (BYTE 1. 23.) X 1) (%P-LDB (BYTE 18. 0.) X))) ((AND (TYPEP X 'INSTANCE) (SEND-IF-HANDLES X :SXHASH NIL))) ((AND (TYPEP X 'NAMED-STRUCTURE) (MEMQ ':SXHASH (NAMED-STRUCTURE-INVOKE :WHICH-OPERATIONS X))) (NAMED-STRUCTURE-INVOKE :SXHASH X NIL)) ((TYPEP X 'SHORT-FLOAT) (SETQ X (%POINTER X)) (LET ((Y (LOGXOR (LDB (byte (- %%Q-POINTER 24.) 0) X) (LSH X (- 24. %%Q-POINTER))))) (LOGAND #o37777777 (IF (MINUSP X) (LOGXOR Y 1) Y)))) ((ARRAYP X) (LENGTH X)) (T 0)))) ;0 for random things ))