Common Lisp中SXHASH处理嵌套列表时equal不等哈希相等问题咨询
你对Common Lisp标准中sxhash的规则存在逻辑理解偏差,该运行结果完全符合标准要求,不属于实现问题。
核心逻辑澄清
Common Lisp标准规定的(equal x y) implies (= (sxhash x) (sxhash y))是单向蕴含规则,仅要求「当两个对象equal判断为真时,它们的sxhash必须相等」,从未要求反过来「sxhash相等的两个对象必须equal」。
哈希冲突的必然性
sxhash本质是面向哈希表设计的通用散列函数,它的输出是固定长度的整数:在SBCL中sxhash返回fixnum类型,64位平台下仅存在2^63种可能的取值,而可构造的Lisp对象是无穷多的,根据鸽巢原理,必然存在多个互不相等的对象对应相同的sxhash值,这种情况就是常规的哈希冲突,是散列函数的固有属性,不属于实现Bug。
测试结果的解释
你测试中遇到的就是典型的哈希冲突场景:两个嵌套结构不同的列表刚好计算出了相同的散列值,完全符合标准的所有约束,没有违反规则。
内容的提问来源于stack exchange,提问作者IgSokolov
相关产品推荐
相关产品推荐

