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 | 7 | (eval-always |
8 | (defvar *global-hasher* #'sxhash)) |
|
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 | 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 | 30 | |
227 | 31 | (defgeneric hash-object (obj)) |
32 | ||
119 | 33 | (defun hash-object-address (obj &optional (test *global-hasher*)) |
34 | "Given some object OBJ, lookup the address with |
|
35 | SB-KERNEL:GET-LISP-OBJ-ADDRESS and return a hash." |
|
36 | (funcall test (sb-kernel:get-lisp-obj-address obj))) |
|
37 | ||
38 | (defun object-address-hash-equalp (a b) |
|
39 | (= (hash-object-address a) (hash-object-address b))) |
|
40 | ||
227 | 41 | (sb-ext:define-hash-table-test object-address-hash-equalp hash-object-address) |
42 | ||
43 | ;; from quicklisp src |
|
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 | 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 | 57 | ;; sb-lockless::multiplicative-hash |