【发布时间】:2021-12-25 04:45:06
【问题描述】:
standard 这么说
(equal x y) implies (= (sxhash x) (sxhash y))。让我们检查一下:
(defun sxhash-test ()
(let ((obj1 (list 1 2 (list 1 1)))
(obj2 (list 1 2 (list 1 2))))
(format t "are objects equal?: ~a~%" (equal obj1 obj2)) ;; => NIL
(format t "are their hashes equal?: ~a~%"(= (sxhash obj1) (sxhash obj2))))) ;; => T
函数equal 按预期工作,但sxhash 没有。你能解释一下我做错了什么吗?我使用 SBCL 2.1.9。
谢谢。
【问题讨论】:
-
基本逻辑:
x implies y不代表not x implies not y。 -
可能的列表比散列值多得多。所以碰撞是可能的。
-
sxhash是否遍历树来创建哈希?似乎并非如此。(list 1 2 3)和(list 1 2 4)创建不同的哈希值。