X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-sxhash.lisp;h=5e7b3d9d68aea2c0b1009f7431c2d8ad374c45b1;hb=a74b0bdb483504f6faddf8089f848f61ed94b92a;hp=5fb976226b61a9144c08d80930b759adad32b472;hpb=f4a7d6c4a2a4f846ad353dddb922dd8967f998e5;p=sbcl.git diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 5fb9762..5e7b3d9 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -26,9 +26,9 @@ ;;; desiderata: ;;; * Non-commutativity keeps us from hashing e.g. #(1 5) to the ;;; same value as #(5 1), and ending up in real trouble in some -;;; special cases like bit vectors the way that CMUCL SXHASH 18b +;;; special cases like bit vectors the way that CMUCL 18b SXHASH ;;; does. (Under CMUCL 18b, SXHASH of any bit vector is 1..) -;;; * We'd like to scatter our hash values the entire possible range +;;; * We'd like to scatter our hash values over the entire possible range ;;; of values instead of hashing small or common key values (like ;;; 2 and NIL and #\a) to small FIXNUMs the way that the CMUCL 18b ;;; SXHASH function does, again helping to avoid pathologies like @@ -145,14 +145,7 @@ (logxor 422371266 (sxhash ; through DEFTRANSFORM (class-name (layout-class (%instance-layout x))))) - ;; Nice though it might be to return a nontrivial - ;; hash value for other instances (especially - ;; STANDARD-OBJECTs) there seems to be no good way - ;; to do so. We can't even do the CLASS-NAME trick - ;; (as used above for STRUCTURE-OBJECT) because - ;; then CHANGE-CLASS would cause SXHASH values to - ;; change, ouch! -- WHN recording wisdom of CSR - 309518995)) + (sxhash-instance x))) (symbol (sxhash x)) ; through DEFTRANSFORM (array (typecase x @@ -169,6 +162,7 @@ (sxhash (char-code x)))) ; through DEFTRANSFORM ;; general, inefficient case of NUMBER (number (sxhash-number x)) + (generic-function (sxhash-instance x)) (t 42)))) (sxhash-recurse x)))