多值哈希常见的lisp

时间:2015-10-05 23:43:19

标签: hash tuples common-lisp hashtable

如何散列像'或符号'这样的'eq-able对象的对或三元组?

在python中我可以使用元组作为字典键,有没有办法在lisp中执行此操作而不诉诸“相等的测试?”

1 个答案:

答案 0 :(得分:2)

虽然某些实现可能提供自定义哈希表函数的规定,但标准只定义了四个:

  

18.1.1 Hash-Table Operations

     

有四种哈希表:那些密钥与eq进行比较的密钥表,那些密钥与eql进行比较的密钥表,其密钥是   与等于和等于与equp进行比较的那些相比较。

这意味着如果您想使用标准哈希表,那么您可能需要使用相等或相等的哈希表。我注意到你写道:

  

如何散列“符号或”等可用对象的对或三元组   整数?

虽然可以使用 eq 可靠地比较符号,但您不应将数字与 eq 进行比较。 eq的文档说:

  

具有相同值的数字不必是eq,...允许实现随时生成字符和数字的“副本”。结果是Common Lisp不能保证eq是真的,即使它的两个参数都是“同一个东西”,如果那个东西是一个字符或数字。

并给出了这个例子:

(eq 3 3)
;   =>  true
; OR=>  false

但是,如果 使用(小)整数元组,则可以轻松地对它们的函数进行散列。例如,元组(a,b,c)可以映射到2 a ×3 b ×5 c 。由于这样的函数会生成 eql 相当的唯一数字,因此您可以使用 eql 哈希表。

这种映射函数的另一个选项(也适用于符号)将使用sxhash。它是一个标准的散列函数,应该为相等值生成相同的值。它是如何工作的,它究竟做了什么并没有真正指定,但它的优势在于它在相同实现的Lisp图像中是稳定的(例如,今天和明天运行一个版本的SBCL,以及 sxhash 将返回相等对象的相同结果。当然,有一个等哈希表可能已经为你做了这个,所以你的里程可能会有所不同。