changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/obj/hash/hasher.lisp

changeset 366: 2b7f0c032fc7
parent: 49c3f3d11432
child: 849bbe48e32d
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 24 May 2024 14:51:25 -0400
permissions: -rw-r--r--
description: fix global-hash
118
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; lib/obj/hash/hasher.lisp --- Hash Functions
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
3
 ;;
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
4
 
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :obj/hash)
119
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
7
 (eval-always
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
8
   (defvar *global-hasher* #'sxhash))
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
9
 
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 227
diff changeset
10
 ;; TODO 2024-05-24: do better
366
2b7f0c032fc7 fix global-hash
Richard Westhaver <ellis@rwest.io>
parents: 365
diff changeset
11
 (sb-ext:define-load-time-global *global-hash* (funcall *global-hasher* (get-universal-time)))
118
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
13
 (macrolet ((specialize (str body)       ; TODO 2023-12-21: test if this actually compiles to fastpath
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
14
              `(if (typep ,str '(simple-array character 1))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
15
                   ,body
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
16
                   ,body)))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
17
   (defun djb (string)
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
18
     (declare (string string)
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
19
              (optimize speed))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
20
     (let ((hash 5381))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
21
       (declare ((and unsigned-byte fixnum) hash))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
22
       (specialize
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
23
        string
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
24
        (dotimes (n (min 6 (length string)))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
25
          (setf hash
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
26
                (logand most-positive-fixnum
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
27
                        (logxor (* hash 33)
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
28
                                (char-code (schar string n)))))))
b828a3caa758 object library stuff, removed DOT - api doesnt jive.
ellis <ellis@rwest.io>
parents:
diff changeset
29
       hash)))
119
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
30
 
227
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
31
 (defgeneric hash-object (obj))
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
32
 
119
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
33
 (defun hash-object-address (obj &optional (test *global-hasher*))
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
34
   "Given some object OBJ, lookup the address with
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
35
   SB-KERNEL:GET-LISP-OBJ-ADDRESS and return a hash."
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
36
   (funcall test (sb-kernel:get-lisp-obj-address obj)))
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
37
 
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
38
 (defun object-address-hash-equalp (a b)
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
39
   (= (hash-object-address a) (hash-object-address b)))
85f27597cf60 castable added, still testing
ellis <ellis@rwest.io>
parents: 118
diff changeset
40
 
227
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
41
 (sb-ext:define-hash-table-test object-address-hash-equalp hash-object-address)
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
42
 
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
43
 ;; from quicklisp src
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
44
 (defun dumb-string-hash (str)
207
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
45
   "Produce a six-character hash of STRING."
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
46
   (let ((hash #xD13CCD13))
227
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
47
     (loop for char across str
207
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
48
           for value = (char-code char)
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
49
           do
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
50
           (setf hash (logand #xFFFFFFFF
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
51
                              (logxor (ash hash 5)
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
52
                                      (ash hash -27)
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
53
                                      value))))
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
54
     (subseq (format nil "~(~36,6,'0R~)" (mod hash 88888901))
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
55
             0 6)))
e48427b30ecd lisp stuff, nu test stuff, back on stable support for rust
Richard Westhaver <ellis@rwest.io>
parents: 119
diff changeset
56
 
227
Richard Westhaver <ellis@rwest.io>
parents: 207
diff changeset
57
 ;; sb-lockless::multiplicative-hash